获取日期,上述日期之间没有重叠

时间:2018-07-31 18:19:04

标签: sql recursion

event_id|event_start|event_end
A            1          10
B            2          11
C            5          15
D            9          12
E           10          13
F           11          20
G           14          22
H           15          22
I           17          27
J           22          27

我有一个如上所述的表格,但我需要这样的预期输出

预期输出:

event_id|event_start|event_end
A            1         10
E            10        13
G            14        22
J            22        27

上述日期之间没有逻辑重叠

1 个答案:

答案 0 :(得分:0)

您可以起诉相关子查询以获取下一个可能事件的ID。然后使用递归CTE通过加入该ID依次添加下一个事件。

以下是Postgres中的示例:

WITH RECURSIVE cte
AS
(
SELECT t1.*,
       (SELECT t2.event_id
               FROM elbat t2
               WHERE t2.event_start >= t1.event_end
               ORDER BY t2.event_start,
                        t2.event_id
               LIMIT 1) next_event_id
       FROM elbat t1
       WHERE t1.event_id = 'A'
UNION ALL
SELECT t1.*,
       (SELECT t2.event_id
               FROM elbat t2
               WHERE t2.event_start >= t1.event_end
               ORDER BY t2.event_start,
                        t2.event_id
               LIMIT 1) next_event_id
       FROM elbat t1
            INNER JOIN cte c
                       ON c.next_event_id = t1.event_id
)
SELECT event_id,
       event_start,
       event_end
       FROM cte
       ORDER BY event_start;

db<>fiddle