Обновление из выбора (подзапроса) с использованием функции задержки

Я работаю над запросом на обновление в SSMS, чтобы рассчитать дни между двумя разными строками с соответствующими серийными номерами. Цель состоит в том, чтобы разделить по серийному номеру, а затем просмотреть запаздывающую запись и вычислить количество дней между двумя записями. В качестве запроса на выбор у меня есть правильная заполняемая информация. Ошибка возникает при попытке использовать часть выбора в качестве подзапроса для обновления записей в таблице, чтобы я мог импортировать эти значения в другую систему для построения визуализации данных. Любая помощь приветствуется!

UPDATE qa_combined_data2
SET
    qa_combined_data2.days_since_last_return =
        (SELECT serial_number,
                receive_date,
                datediff(day, receive_date, LAG(receive_date, 1)
                                            OVER (PARTITION BY serial_number 
                                                      ORDER BY receive_date)) *-1 
                AS days_between_returns_update
             FROM qa_combined_data2)
    WHERE qa_combined_data2.serial_number = qa_combined_data2.serial_number
      AND qa_combined_data2.receive_date = qa_combined_data2.receive_date;
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
21
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте что-то вроде этого:

UPDATE Q1
SET days_since_last_return = Q2.days_between_returns_update
FROM qa_combined_data2 Q1
INNER JOIN 
        (SELECT serial_number,
                receive_date,
                datediff(day, receive_date, LAG(receive_date, 1)
                                            OVER (PARTITION BY serial_number 
                                                      ORDER BY receive_date)) *-1 
                AS days_between_returns_update
             FROM qa_combined_data2) Q2
    ON Q1.serial_number = Q2.serial_number
      AND Q1.receive_date = Q2.receive_date;

Ваша основная проблема заключается в том, что вы выбираете дополнительные столбцы в подзапросе. Также ваш WHERE не имеет смысла и, вероятно, должен быть внутри подзапроса.

Еще одна проблема заключается в том, что вам не нужен подзапрос и повторный запрос к базовой таблице. Вы можете использовать производную таблицу или CTE и просто запросить базовую таблицу один раз.

Также:

  • * -1 то же, что -.
  • Но вам это все равно не нужно, потому что вы можете поменять местами параметры LAG.
  • LAG(..., 1) по умолчанию.
UPDATE qad
SET
    days_since_last_return = days_between_returns_update
FROM (
    SELECT *,
        DATEDIFF(day, LAG(receive_date)
                       OVER (PARTITION BY serial_number 
                             ORDER BY receive_date)
                     , receive_date)
                AS days_between_returns_update
    FROM qa_combined_data2
) qad;

Другие вопросы по теме