Я работаю над запросом на обновление в 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;
Попробуйте что-то вроде этого:
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;