我们有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 |
+------------+---------+-----------+-------------+-------------+
任何帮助都应该受到赞赏!
答案 0 :(得分:0)
使用查询,我能够找到答案。
事实证明答案很简单:我通过在UserID
上进行联接来得到结果,其中时间段相交(即StartDate
来自employment
< {{1}来自EndDate
的{{1}}和来自status_history
的{{1}}> EndDate
的{{1}}。对于NULL EndDate的边缘情况,我使用今天的日期。
然后,我只选择两个StartDate的GREATEST,以及两个EndDate的LEAST。