Обновление SQL для записи с ближайшими данными - PullRequest
0 голосов
/ 26 октября 2009

В SQL Server 2008:

Предположим, у меня есть две таблицы.

Таблица1 имеет 3 поля: Имя, Дата1 и Дата2. В настоящее время все записи Date2 имеют значение NULL. (Имя, Дата1) образуют уникальный ключ.

Таблица2 имеет 2 поля: Имя и Дата2. (Имя, Дата2) образуют уникальный ключ.

Каждое «Имя» в Таблице 1 имеет хотя бы одну соответствующую запись в Таблице 2.

Теперь я хочу обновить все записи Date2 в Таблице 1 (помните, что все они имеют значение NULL прямо сейчас) до записи Date2 в Таблице 2, которая является ближайшей к Date1 в Таблице1. То есть дата, которая дала бы результат:

 min(datediff(dd,Table1.Date1,Table2.Date2))

Чтобы было ясно, если у меня есть следующие записи:

Table1:

[Имя]: Карл, [Date1]: 01.01.2009, [Date2]: NULL

Table2:

[Имя]: Карл, [Date2]: 1/1/2000

[Имя]: Карл, [Date2]: 1/7/2009

[Имя]: Карл, [Date2]: 1/1/2010

Затем я хочу обновить Table1.Date2 до «1/7/2009», поскольку это самая близкая дата к «01.01.2009».

Большое спасибо

Karl

Ответы [ 2 ]

1 голос
/ 11 ноября 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)
1 голос
/ 26 октября 2009
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, норазные стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...