#sql #sql-update
#sql #sql-обновление
Вопрос:
Я пытаюсь обновить таблицу, которая выглядит так, как показано ниже. Я хочу, чтобы ColB обновлялся на 1, пока мы не дойдем до 3 (12-10-2020) .. затем обновите ColB на 3 до 12-15-2020. Я пытаюсь использовать лаг и слияние, но не могу получить доступ ко всем сразу. Придется запускать запрос много раз. Есть какие-нибудь подсказки здесь?? Пожалуйста, помогите. Большое вам спасибо!
ColA ColB ColC
12-1-2020 1 X
12-2-2020 0
12-3-2020 0
12-4-2020 0
.
.
.12-10-2020 3 Y
.
.
12-15-2020 0
Комментарии:
1. Пометьте свой вопрос базой данных, которую вы используете.
Ответ №1:
Вы можете сгенерировать нужные данные, используя lag(ignore nulls)
:
select t.*,
lag(case when colc is not null then colb end ignore nulls) over (order by cola)
from t;
Не все базы данных поддерживают эту стандартную конструкцию. Но вы можете использовать:
select t.*, max(colb) over (partition by grp)
lag(case when colc is not null then colb end ignore nulls) over (order by cola)
from (select t.*,
count(colc) over (order by cola) as grp
from t
) t
То, как это включается в an update
, зависит от базы данных, но вы можете легко вычислить значение на лету.
Комментарии:
1. Спасибо, Гордон. Я использую SQL DB. Не уверен, но SQL, похоже, не работает для меня. «count (colc) over (order by cola) as grp» дает мне случайные ответы
2. Я пытаюсь сделать это: с помощью cte_max как (выберите [fid], CDate,Ptype, max(случай, когда (Pcount не равен НУЛЮ), затем (Pcount end) поверх (разделение по [fid], CDate,Ptype, порядок по [fid], CDate,Ptype, ) cummcnt изct ) выберите * из cte_max в порядке [fid], CDate,Ptype
3. Пытаюсь выяснить, может ли Merge обновиться за один раз, используя приведенные выше SQL-запросы
4. @SA2020 . , , я не знаю, что означает «случайные ответы». В выражении нет ничего случайного. Вы должны пометить базу данных, которую вы используете. Также было бы полезно предоставить скрипку db / SQL.