如何正确连接两个每个都有开始日期和停止日期列的表?
How to correctly join two tables that each have Start Date and Stop Date columns?
这应该很容易,甚至可能是重复的,但今天我的大脑和搜索引擎都没有太大帮助。
我的问题如下:
Given two tables that both have:
- A start date
- A stop date
- A property of an employee. Let's say Desk Number in table A and Team in table B
- 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
这应该很容易,甚至可能是重复的,但今天我的大脑和搜索引擎都没有太大帮助。
我的问题如下:
Given two tables that both have:
- A start date
- A stop date
- A property of an employee. Let's say Desk Number in table A and Team in table B
- 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