代码之家  ›  专栏  ›  技术社区  ›  Karl

SQL更新以记录最近的数据

  •  0
  • Karl  · 技术社区  · 16 年前

    假设我有两张桌子。

    表1有3个字段:名称、日期1和日期2。目前,所有Date2条目都为空。(名称,日期1)形成唯一键。

    表2有两个字段:Name和Date2。(名称,日期2)形成一个唯一键。

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

    现在,我想将表1中的所有Date2条目(记住它们现在都为空)更新为表2中的Date2条目,即 截至日期1,见表1。即给出以下结果的日期:

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

    表1:

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

    表2:

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

    [姓名]:卡尔[日期2]:1/7/2009

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

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

    卡尔

    2 回复  |  直到 16 年前
        1
  •  1
  •   van    16 年前
    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中有两个日期与Date1的距离相同,但来自不同侧面的情况。

        2
  •  1
  •   Damir Sudarevic    16 年前
    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)