Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL合并重叠时间间隔_Sql_Sqlite - Fatal编程技术网

SQL合并重叠时间间隔

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

我有这样一个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到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;