在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'的最近日期。

非常感谢

卡尔

有帮助吗?

解决方案

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 - 我想你这样做。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top