Обновить столбец на основе значения столбца других строк - PullRequest
0 голосов
/ 02 мая 2020

У меня есть таблица t, которая выглядит следующим образом

   key fill store end_date    status
    1  123  1      2019-04-30  0  
    2  1234 1      2019-04-30  0
    3  123  1      2019-05-01  0

Теперь мне нужно обновить первую запись и установить status=1, так как третья запись имеет такое же заполнение, значение хранилища и оно самое последнее.

Вывод:

   key fill store end_date    status
    1  123  1      2019-04-30  1  
    2  1234 1      2019-04-30  0
    3  123  1      2019-05-01  0

Я попытался вычислить row_number и попытался обновить столбец на его основе, но не смог выяснить, как использовать результат в предложении обновления.

update t set
  status = 1
from (
  select *
  from (
    select *
      , row_number() over (partition by fill, store order by end_dt desc) as row_num from t
    ) a
    where row_num = 2
  ) b

Этот запрос обновляет все записи, что должно измениться в моем запросе, чтобы получить ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вы можете сделать коррелированный подзапрос:

update my_table a
set status = 1
where exists (
  select 1 
  from my_table b 
  where b.fill = a.fill 
    and b.store = a.store 
    and b.end_date > a.end_date
)
0 голосов
/ 02 мая 2020

Я думаю, что вы хотите:

with cte as (
    select status, row_number() over(partition by fill, store order by end_date desc) rn
    from t
)
update cte set status = 1 where rn > 1

В общем табличном выражении row_number() ранжирует записи с одинаковыми fill и store по убыванию end_date. Затем внешний запрос устанавливает status в 1 для строк, которые не были ранжированы первыми.

...