如何正确连接两个每个都有开始日期和停止日期列的表?

How to correctly join two tables that each have Start Date and Stop Date columns?

这应该很容易,甚至可能是重复的,但今天我的大脑和搜索引擎都没有太大帮助。

我的问题如下:

Given two tables that both have:

  1. A start date
  2. A stop date
  3. A property of an employee. Let's say Desk Number in table A and Team in table B
  4. The employee's unique ID number.

join together the two tables in some honest way such that you only need one start and stop date per row in the resulting table.

示例输入和所需输出: Table答:

Start Date Stop Date ID Desk Number
01/20 05/20 0100 55
03/20 06/20 0100 56
02/22 04/22 0200 91

Table B(注意员工 0100 的日期重叠):

Start Date Stop Date ID Team Number
01/20 04/20 0100 2
02/20 06/20 0100 3
02/22 04/22 0200 8

示例输出:

Start Date Stop Date ID Desk Number Team Number
01/20 04/20 0100 55 2
02/20 05/20 0100 55 3
02/20 06/20 0100 56 3
02/22 04/22 0200 91 8

一旦正确连接了表,我就可以处理结果日期,但连接本身给我带来了问题。我只是不知道如何确保某些超出范围的日期不会滑入。我目前不确定的加入解决方案是加入

[Table A].[Start Date] <= [Table B].[Stop Date]
[Table B].[Start Date] <= [Table A].[Stop Date]

然后取 max/min 日期(不用担心那部分,我只关心连接),但我非常怀疑解决方案真的那么简单。

假设我没有弄错,所需的输出应该是

Start Date Stop Date ID Desk Number Team Number
01/20 04/20 0100 55 2
02/20 05/20 0100 55 3
03/20 04/20 0100 56 2
03/20 06/20 0100 56 3
02/22 04/22 0200 91 8

您对连接的直觉确实是正确的,这会产生正确的结果:

SELECT CASE
         WHEN teams.start_date > desks.start_date
         THEN teams.start_date
         ELSE desks.start_date
       END start_date
     , CASE
         WHEN teams.stop_date < desks.stop_date
         THEN teams.stop_date
         ELSE desks.stop_date
       END stop_date
     , desks.id
     , desks.desk_number
     , teams.team_number
  FROM desks
  JOIN teams
    ON desks.start_date < teams.stop_date
   AND teams.start_date < desks.stop_date
   AND teams.id = desks.id

Working demo on dbfiddle