#mysql #sql
#MySQL #sql
Вопрос:
У меня есть следующий запрос, который работает в MySQL 8.0, который я изо всех сил пытаюсь перевести в MySQL 5.7
UPDATE (SELECT se.*,
CASE WHEN se.end_date IS NULL
THEN dateadd(DAY, 0, LEAD(se.start_date, 1)
OVER(PARTITION BY se.id ORDER BY se.start_date))
ELSE se.end_date END AS newEndDate
FROM `better`.`DimUserTemp` AS se
WHERE se.id IN (SELECT id FROM `better`.user_update_staging))
SET end_date = newEndDate
WHERE end_date IS NULL;
Любые предложения будут с благодарностью!
Комментарии:
1. Примеры данных и желаемых результатов помогут. Как выглядят данные?
Ответ №1:
Вы можете использовать коррелированный подзапрос для вычисления следующей начальной даты, а затем использовать это в update
… при условии, что у вас есть первичный ключ в таблице:
update dut
from better.DimUserTemp dut join
(select dut.*,
(select min(dut3.startdate)
from better.DimUserTemp dut3
where dut3.id = dut2.id and
dut3.startdate > dut2.startdate
) as next_startdate
from better.DimUserTemp dut2
where dut2.id in (select uus.id from better.user_update_staging uus)
) dut2
on dut2.id = dut.id -- or whatever the pk is
set dut.end_date = dut2.next_start_date
where dut.end_date is null;