Обновление SQL для записи с ближайшими данными
-
06-07-2019 - |
Вопрос
В SQL-сервере 2008:
Предположим, у меня есть две таблицы.
Таблица1 имеет 3 поля:Имя, Дата1 и Дата2.В настоящее время все записи Date2 имеют значение NULL.(Имя, Дата1) образуют уникальный ключ.
Таблица2 имеет 2 поля:Имя и Дата2.(Имя, Дата2) образуют уникальный ключ.
Каждому «Имени» в Таблице 1 соответствует хотя бы одна соответствующая запись в Таблице 2.
Теперь я хочу обновить все записи Date2 в Таблице 1 (помните, что сейчас все они имеют значение NULL) до записи Date2 в Таблице 2, которая является ближайший до даты1 в Таблице1.Т.е.дата, которая даст результат:
min(datediff(dd,Table1.Date1,Table2.Date2))
Итак, чтобы внести ясность, если у меня есть следующие записи:
Таблица 1:
[Имя]:Карл, [Дата1]:01.01.2009, [Дата2]:НУЛЕВОЙ
Таблица 2:
[Имя]:Карл, [Дата2]:01.01.2000
[Имя]:Карл, [Дата2]:07.01.2009
[Имя]:Карл, [Дата2]:01.01.2010
Затем я хочу обновить Table1.Date2 до «07.01.2009», поскольку это ближайшая дата к «01.01.2009».
Большое спасибо
Карл
Решение
WITH abcd AS
(
SELECT t1.Name,t1.Date1, t2.Date2
,RANK() OVER (ORDER BY ABS(DATEDIFF(dd, t1.Date1, t2.Date2)) ASC) AS rnk
FROM
Table1 AS t1
JOIN Table2 AS t2 ON t1.Name = t2.Name
)
UPDATE Table1 SET
[Date2] = (SELECT TOP(1) [Date2] FROM abcd WHERE rnk = 1)
Другие советы
UPDATE Table1
SET Date2 = t2.Date2
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
AND ABS(DATEDIFF(d, t1.Date1, t2.Date2)) = (SELECT MIN(ABS(DATEDIFF(d, t1.Date1, t2.Date2)))
FROM Table1 t1
JOIN Table2 t2
ON t1.Name = t2.Name
)
Проверьте, нужно ли вам ABS
- Думаю, да.
Также запрос не обрабатывает случай, когда в Таблице2 есть 2 даты на одинаковом расстоянии от Даты1, но с разных сторон.