在 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_historyEndDate 来自 employment > StartDate 来自 status_history。对于 NULL EndDate 的边缘情况,我使用今天的日期。

然后,我只是 select 两个 StartDate 中的 GREATEST,以及两个 EndDate 中的 LEAST。