Объединение таблиц по ID и ближайшей дате - PullRequest
0 голосов
/ 24 марта 2020

У меня есть две таблицы, одна показывает, когда кто-то ушел, а другая показывает, когда они вернулись (иногда, когда они возвращаются, они могут забыть указать, что они вернулись. Я пытаюсь присоединиться к таблицам, чтобы они выглядели как нужную таблицу с картинки.

enter image description here

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Вы можете попробовать это.

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
0 голосов
/ 24 марта 2020

Очень сложный вопрос. Я думаю это делает то, что вы хотите:

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
0 голосов
/ 24 марта 2020

Эти таблицы недействительны, они должны быть в одной таблице с 3 столбцами. ID, оставить, вернуть

...