在 2 个时间段相交的地方加入
Join where 2 time periods intersect
我们有 2 个 table,正在尝试弄清楚如何在两个时间段相交的地方进行交叉连接。
第一个 table (employment
) 包含 4 列:
EmployerID, UserID, StartDate, EndDate
第二个table(status_history
)也包含4列:
UserID, Status, StartDate, EndDate
employment
table 包含显示 "job" 每个用户关联的记录,以及持续多长时间(StartDate 和 EndDate)。类似地,status_history
包含显示用户是否活跃/不活跃(就业或失业)的记录 - 也包含 StartDate 和 EndDate。
我们正在尝试构建一个视图,以在两个 table 之间创建一个适当的 "cross join"。
EmployerID, UserID, Status, StartDate, EndDate
我尝试创建一个 SQL Fiddle,但出于某种原因,我从他们那里收到了一个错误。因此,我提供了以下架构:
CREATE TABLE employment
(`EmployerID` int, `UserID` int, `StartDate` date, `EndDate` date);
CREATE TABLE status_history
(`UserID` int, `Status` varchar(10), `StartDate` date, `EndDate` date);
INSERT INTO employment
(`EmployerID`, `UserID`, `StartDate`, `EndDate`)
VALUES
(123, 111, '2017-01-01', '2017-03-04'),
(345, 111, '2017-03-04', '2017-03-07'),
(567, 111, '2017-03-07', '2017-04-10'),
(789, 111, '2017-04-10', NULL)
;
INSERT INTO status_history
(`UserID`, `Status`, `StartDate`, `EndDate`)
VALUES
(111, 'Active', '2017-01-01', '2017-02-17'),
(111, 'Inactive', '2017-02-17', '2017-03-02'),
(111, 'Active', '2017-03-02', '2017-03-09'),
(111, 'Inactive', '2017-03-09', NULL),
;
根据数据,我想检索以下行:
+------------+---------+-----------+-------------+-------------+
| EmployerID | UserID | Status | StartDate | EndDate |
+------------+---------+-----------+-------------+-------------+
| 123 | 111 | Active | 2017-01-01 | 2017-02-17 |
| 123 | 111 | Inactive | 2017-02-17 | 2017-03-02 |
| 123 | 111 | Active | 2017-03-02 | 2017-03-04 |
| 345 | 111 | Active | 2017-03-04 | 2017-03-07 |
| 567 | 111 | Active | 2017-03-07 | 2017-03-09 |
| 567 | 111 | Inactive | 2017-03-09 | 2017-04-10 |
| 789 | 111 | Inactive | 2017-04-10 | NULL |
+------------+---------+-----------+-------------+-------------+
任何帮助都将不胜感激!
通过查询,我找到了答案。
事实证明答案很简单:我通过在时间段相交的 UserID
上进行连接得到了结果(即 StartDate
来自 employment
< EndDate
来自 status_history
和 EndDate
来自 employment
> StartDate
来自 status_history
。对于 NULL EndDate 的边缘情况,我使用今天的日期。
然后,我只是 select 两个 StartDate 中的 GREATEST,以及两个 EndDate 中的 LEAST。
我们有 2 个 table,正在尝试弄清楚如何在两个时间段相交的地方进行交叉连接。
第一个 table (employment
) 包含 4 列:
EmployerID, UserID, StartDate, EndDate
第二个table(status_history
)也包含4列:
UserID, Status, StartDate, EndDate
employment
table 包含显示 "job" 每个用户关联的记录,以及持续多长时间(StartDate 和 EndDate)。类似地,status_history
包含显示用户是否活跃/不活跃(就业或失业)的记录 - 也包含 StartDate 和 EndDate。
我们正在尝试构建一个视图,以在两个 table 之间创建一个适当的 "cross join"。
EmployerID, UserID, Status, StartDate, EndDate
我尝试创建一个 SQL Fiddle,但出于某种原因,我从他们那里收到了一个错误。因此,我提供了以下架构:
CREATE TABLE employment
(`EmployerID` int, `UserID` int, `StartDate` date, `EndDate` date);
CREATE TABLE status_history
(`UserID` int, `Status` varchar(10), `StartDate` date, `EndDate` date);
INSERT INTO employment
(`EmployerID`, `UserID`, `StartDate`, `EndDate`)
VALUES
(123, 111, '2017-01-01', '2017-03-04'),
(345, 111, '2017-03-04', '2017-03-07'),
(567, 111, '2017-03-07', '2017-04-10'),
(789, 111, '2017-04-10', NULL)
;
INSERT INTO status_history
(`UserID`, `Status`, `StartDate`, `EndDate`)
VALUES
(111, 'Active', '2017-01-01', '2017-02-17'),
(111, 'Inactive', '2017-02-17', '2017-03-02'),
(111, 'Active', '2017-03-02', '2017-03-09'),
(111, 'Inactive', '2017-03-09', NULL),
;
根据数据,我想检索以下行:
+------------+---------+-----------+-------------+-------------+
| EmployerID | UserID | Status | StartDate | EndDate |
+------------+---------+-----------+-------------+-------------+
| 123 | 111 | Active | 2017-01-01 | 2017-02-17 |
| 123 | 111 | Inactive | 2017-02-17 | 2017-03-02 |
| 123 | 111 | Active | 2017-03-02 | 2017-03-04 |
| 345 | 111 | Active | 2017-03-04 | 2017-03-07 |
| 567 | 111 | Active | 2017-03-07 | 2017-03-09 |
| 567 | 111 | Inactive | 2017-03-09 | 2017-04-10 |
| 789 | 111 | Inactive | 2017-04-10 | NULL |
+------------+---------+-----------+-------------+-------------+
任何帮助都将不胜感激!
通过查询,我找到了答案。
事实证明答案很简单:我通过在时间段相交的 UserID
上进行连接得到了结果(即 StartDate
来自 employment
< EndDate
来自 status_history
和 EndDate
来自 employment
> StartDate
来自 status_history
。对于 NULL EndDate 的边缘情况,我使用今天的日期。
然后,我只是 select 两个 StartDate 中的 GREATEST,以及两个 EndDate 中的 LEAST。