SQL合并重叠时间间隔
我有这样一个sqlite数据集SQL合并重叠时间间隔,sql,sqlite,Sql,Sqlite,我有这样一个sqlite数据集 Startdate | Enddate | ID 2019-04-29 | 2019-05-04 | 12 2019-04-23 | 2019-04-25 | 533 2019-04-23 | 2019-04-24 | 44 2019-04-24 | 2019-04-25 | 79 我试图得到一个从startdate到startdate再加上循环中直到最后一个EndDate的范围内排序的输出。 计划是获取从minStartdate到minStartda
Startdate | Enddate | ID
2019-04-29 | 2019-05-04 | 12
2019-04-23 | 2019-04-25 | 533
2019-04-23 | 2019-04-24 | 44
2019-04-24 | 2019-04-25 | 79
我试图得到一个从startdate到startdate再加上循环中直到最后一个EndDate的范围内排序的输出。
计划是获取从minStartdate到minStartdate+1和minStartdate+2的所有观测值,依此类推
Range | ID
2019-04-23 2019-04-24 | 44
2019-04-23 2019-04-25 | 44
2019-04-23 2019-04-25 | 533
2019-04-23 2019-04-25 | 79
2019-04-23 2019-05-04 | 44
2019-04-23 2019-05-04 | 533
2019-04-23 2019-05-04 | 79
2019-04-23 2019-05-04 | 12
我不确定是否必须实现这一点我相信以下内容将提供您想要的结果:-
WITH cte(sdate,edate) AS
(
SELECT (SELECT min(startdate) FROM mytable),(SELECT min(startdate) FROM mytable)
UNION ALL
SELECT sdate,date(edate,'+1 days')
FROM cte
WHERE edate <= (
SELECT max(enddate) FROM mytable
)
LIMIT 1000 /* just in case limit to 1000 rows */
)
SELECT sdate||' '||edate AS Range, id
FROM cte
JOIN mytable ON startdate >= sdate
AND enddate <= edate
AND edate IN (SELECT enddate FROM mytable)
示例/测试/演示
结果是:-
唯一的区别是ID列的顺序,我看不到与预期结果的任何顺序
根据注释限制,不需要1000
DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (startdate TEXT, enddate TEXT, id INTEGER PRIMARY KEY);
INSERT INTO mytable VALUES
('2019-04-29','2019-05-04',12),
('2019-04-23','2019-04-25',533),
('2019-04-23','2019-04-24',44),
('2019-04-24','2019-04-25',79)
;
WITH cte(sdate,edate) AS
(
SELECT (SELECT min(startdate) FROM mytable),(SELECT min(startdate) FROM mytable)
UNION ALL
SELECT sdate,date(edate,'+1 days')
FROM cte
WHERE edate <= (
SELECT max(enddate) FROM mytable
)
LIMIT 1000 /* just in case limit to 1000 rows */
)
SELECT sdate||' '||edate AS Range, id
FROM cte
JOIN mytable ON startdate >= sdate
AND enddate <= edate
AND edate IN (SELECT enddate FROM mytable)
;
DROP TABLE IF EXISTS mytable;