加入两个时间段相交的地方

时间:2017-07-12 01:53:45

标签: mysql cross-join

我们有2个表,并试图弄清楚如何在2个时间段相交的情况下进行交叉连接。

第一个表格(employment)包含4列:

EmployerID, UserID, StartDate, EndDate

第二个表(status_history)也包含4列:

UserID, Status, StartDate, EndDate

employment表包含显示" job"每个用户都与之关联,并持续多长时间(StartDate和EndDate)。同样,status_history包含显示用户是处于活动/非活动状态(已雇用还是失业)的记录 - 也包括StartDate和EndDate。

我们正在尝试构建一个可以创建正确的交叉连接的视图。在两张桌子之间。

EmployerID, UserID, Status, StartDate, EndDate

我尝试创建一个SQL小提琴,但出于某种原因,我从他们那里得到了一个错误。所以,我在下面提供了Schema:

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       |
+------------+---------+-----------+-------------+-------------+

任何帮助都应该受到赞赏!

1 个答案:

答案 0 :(得分:0)

使用查询,我能够找到答案。

事实证明答案很简单:我通过在UserID上进行联接来得到结果,其中时间段相交(即StartDate来自employment< {{1}来自EndDate的{​​{1}}和来自status_history的{​​{1}}> EndDate的{​​{1}}。对于NULL EndDate的边缘情况,我使用今天的日期。

然后,我只选择两个StartDate的GREATEST,以及两个EndDate的LEAST。