用最近的数据记录的SQL更新

时间:2009-10-26 06:09:43

标签: sql sql-server sql-server-2008 updates

在SQL Server 2008中:

假设我有两张桌子。

Table1有3个字段:Name,Date1和Date2。目前,所有Date2条目都是NULL。 (Name,Date1)形成一个唯一的密钥。

Table2有2个字段:Name和Date2。 (名称,日期2)形成一个唯一的密钥。

表1中的每个“名称”在表2中至少有一个相应的条目。

现在,我想将Table1中的所有Date2条目(请记住它们现在都是NULL)更新到Table2中的Date2条目,即Table1中与Date1的最接近。即给出结果的日期:

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

所以要清楚,如果我有以下条目:

表1:

[姓名]:卡尔,[日期1]:2009年1月1日,[日期2]:空白

表2:

[姓名]:Karl,[Date2]:1/1/2000

[姓名]:卡尔,[日期2]:2009年1月7日

[姓名]:卡尔,[日期2]:2010年1月1日

然后我想将Table1.Date2更新为'1/7/2009',因为这是'1/1/2009'的最近日期。

非常感谢

卡尔

2 个答案:

答案 0 :(得分: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 - 我想你会这样做。

此查询也不处理Table2中有2个日期与Date1的距离相同但来自不同边的情况。

答案 1 :(得分:1)

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)