【问题标题】:Joining tables on ID and closest date根据 ID 和最近日期连接表
【发布时间】:2020-03-24 19:15:20
【问题描述】:

我有两张桌子,一张显示某人何时离开,一张显示他们何时回来(有时他们回来时,他们可能会忘记输入他们回来了。我正在尝试加入这些桌子,以便它们看起来像图片中想要的表格。

【问题讨论】:

  • 。 .这是一个棘手的问题。您应该设置一个 dbfiddle 或至少在问题中包含文本格式的数据。

标签: sql sql-server database tsql


【解决方案1】:

你可以试试这个。

DECLARE @TableA TABLE(ID INT, Leave DATE)
INSERT INTO @TableA VALUES
(62175, '11/29/2019'),
(62175, '11/11/2019'),
(62175, '3/29/2019'),
(62175, '8/22/2019'),
(68454, '11/29/2019'),
(68454, '12/13/2019')


DECLARE @TableB TABLE(ID INT, [Return] DATE)
INSERT INTO @TableB VALUES
(62175, '4/4/2019'),
(62175, '11/16/2019'),
(62175, '11/30/2019'),
(68454, '11/30/2019'),
(68454, '12/14/2019')

SELECT TA.*, CASE WHEN ROW_NUMBER()OVER(PARTITION BY X.ID, X.[Return] ORDER BY TA.Leave DESC) = 1 THEN X.[Return] ELSE NULL END [Return] 
FROM @TableA TA
    OUTER APPLY (SELECT TOP 1 * FROM @TableB TB 
                    WHERE TA.ID = TB.ID 
                        AND TB.[Return] > TA.Leave 
                    ORDER BY TB.[Return] ) X
ORDER BY TA.ID, TA.Leave

结果:

ID          Leave      Return
----------- ---------- ----------
62175       2019-03-29 2019-04-04
62175       2019-08-22 NULL
62175       2019-11-11 2019-11-16
62175       2019-11-29 2019-11-30
68454       2019-11-29 2019-11-30
68454       2019-12-13 2019-12-14

【讨论】:

    【解决方案2】:

    这些表无效,它们应该在一个 3 列的表中。身份证,离开,返回

    【讨论】:

    • 实际上重复日期,我必须考虑日期
    【解决方案3】:

    非常棘手的问题。我认为这就是你想要的:

    with ab as (
          select id, leave, null as return
          from a
          union all
          select id, null, return
          from b
         )
    select distinct id, coalesce(leave, prev_leave), coalesce(return, next_return)
    from (select ab.*,
                 (case when leave is null
                       then lag(leave) over (partition by id order by coalesce(leave, return))
                  end) as prev_leave, 
                 (case when leave is null
                       then lead(leave) over (partition by id order by coalesce(leave, return))
                  end) as next_return
          from ab
         ) ab
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2023-03-19
      相关资源
      最近更新 更多