Перевод ведущего раздела запроса MySQL с помощью

#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;