Обновите все записи, кроме одной, в таблице в 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;
Другие вопросы по тегам