Обновите все записи, кроме одной, в таблице в Snowflake Computing
Я использую эластичное хранилище данных Snowflake, предоставленное Snowflake Computing. У меня есть таблица, в которой нет столбца идентификатора или первичного ключа, но в таблице есть повторяющиеся строки.
Моя проблема заключается в том, что в каждом дублированном наборе мне нужно обновить все, кроме одной из дублированных строк из каждого дублированного набора, обнулением finalsale
а также taxindollars
столбцы в таблице. Неважно, какая из дублированных строк остается нетронутой / не обновляется. Таким образом, если есть 3 дублированных строки, только 2 из этих строк должны быть обнулены, а другая оставшаяся строка должна быть нетронутой. Я попытался сделать следующий запрос, который был дан как ответ здесь:
Обновите все кроме одной повторяющейся записи в таблице в SQL Server
Но это не работает в Снежинке. Он говорит мне, что объект "T" не существует. Однако ниже приведены точные строки, которые должны быть обновлены (исключая 1 позицию для каждого набора, который не нужно обновлять). Любые идеи о том, как я могу сделать это в Snowflake и получить все кроме 1 из дублированных строк для каждого дублированного набора, обновленного с 0 для finalsale
а также taxindollars
?
UPDATE t SET
t.finalsale = 0,
t.taxindollars = 0
FROM (
SELECT *, row_number() OVER(PARTITION BY
saleid,
locationname,
customertype,
finalsale,
quantity,
sku
ORDER BY
(SELECT NULL)) row_num
FROM
salesdetail
) t
WHERE row_num > 1
Спасибо за вашу помощь!
1 ответ
Используйте раздел ROW_NUMBER по предложению и поместите результаты в CTE. Это может выглядеть примерно так:
with myData as (
select mycolumn1, mycolumn2, myDate
,row_number() over (partition by mycolumn1 order by myDate desc) as priority
from source_table
)
select * from myData where priority = 1
Затем запустите выбор или обновление в строках, где число = 1
--drop table foo purge;
create table foo as
select 1 id, 'x' dsc from dual
union all select 1 id, 'x' dsc from dual
union all select 1 id, 'x' dsc from dual
union all select 1 id, 'z' dsc from dual
union all select 1 id, 'z' dsc from dual
union all select 1 id, 'z' dsc from dual
union all select 2 id, 'y' dsc from dual
union all select 2 id, 'y' dsc from dual
union all select 2 id, 'y' dsc from dual;
select * from foo;
create table bar as
with trg as (select ID
, DSC
, row_number() over (partition by ID, DSC order by null) rn
from foo)
select ID
, case when rn = 1 then upper(dsc)
else dsc
end DSC
from trg;
truncate table foo;
insert into foo select * from bar;
commit;
drop table bar purge;
select * from foo;