我需要一个SQL查询来创建一个新字段group_id
,该字段标识每个ID
中具有重叠的start_time
和end_time
间隔的记录。可接受的解决方案将为每个group_id
具有唯一的ID
和重叠的时间间隔集。
例:
计算出group_id的样本times
表
ID START_TIME END_TIME GROUP_ID
100 10:00:00 12:00:00 1
100 10:15:00 12:30:00 1
100 12:15:00 12:45:00 1
100 13:00:00 14:00:00 2
101 09:00:00 13:00:00 1
101 09:30:00 13:30:00 1
101 10:00:00 10:20:00 1
101 10:19:59 11:15:00 1
101 10:21:00 10:30:00 1
101 11:00:00 12:30:00 1
101 11:30:00 12:35:00 1
102 10:01:00 11:25:00 1
102 11:01:00 11:30:00 1
105 10:00:00 10:20:00 1
105 10:21:00 10:30:00 2
105 10:30:01 11:00:00 3
106 10:00:00 10:22:00 1
107 10:19:57 10:20:01 1
108 10:01:01 10:16:59 1
附加信息:对于给定的
ID
,如果其任何间隔重叠,则对应的记录属于同一组,因此应具有相同的group_id
。当A的start_time
和/或end_time
在B的start_time
和end_time
之间时,记录A与另一个记录B重叠。在示例中,
ID
= 100有四个间隔。前三个重叠=>第二条记录与第一条重叠(10:15的start_time
在10:00至12:00的start_time
和end_time
之间),第三条与第二条记录重叠( 12:15的start_time
在10:15到12:30的start_time
和end_time
之间。因此,它们都具有相同的group_id
为1。ID
= 100的第四个间隔不与该ID
中的任何其他间隔重叠,因此它成为自己的组并带有新的。最后一条记录具有完全不同的group_id
,因此它也以新的ID
开始了第三组。编辑:我已经尝试过此MYSQL脚本。输出不会重置组ID,而是以串行顺序继续。想知道哪些更改可以使其工作。
WITH C1 AS (
SELECT *,
CASE
WHEN start_time <= MAX(IFnull(end_time,'9999-12-31 00:00:00.000')) OVER(
partition by id
ORDER BY start_time
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
)
THEN 0
ELSE 1
END AS isstart
FROM activity
)
SELECT ID,start_time,end_time,
SUM(isstart) OVER(ORDER BY ID ROWS UNBOUNDED PRECEDING) AS DG
FROM C1;
Query Output:
100 10:00:00 12:00:00 1
100 10:15:00 12:30:00 1
100 12:15:00 12:45:00 1
100 13:00:00 14:00:00 2
101 09:00:00 13:00:00 3
101 09:30:00 13:30:00 3
101 10:00:00 10:20:00 3
101 10:19:59 11:15:00 3
101 10:21:00 10:30:00 3
101 11:00:00 12:30:00 3
101 11:30:00 12:35:00 3
102 10:01:00 11:25:00 4
102 11:01:00 11:30:00 4
105 10:00:00 10:20:00 5
105 10:21:00 10:30:00 6
105 10:30:01 11:00:00 7
106 10:00:00 10:22:00 8
107 10:19:57 10:20:01 9
108 10:01:01 10:16:59 10
(删除mysql-server标签)
最佳答案
WITH C1 AS (
SELECT *,
CASE
WHEN start_time <= MAX(IFnull(end_time,'9999-12-31 00:00:00.000')) OVER(
partition by id
ORDER BY start_time
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
)
THEN 0
ELSE 1
END AS isstart
FROM activity
)
SELECT ID,start_time,end_time,
SUM(isstart) OVER(partition by id ORDER BY ID ROWS UNBOUNDED PRECEDING) AS DG
FROM C1;
这应该为你工作
关于mysql - 如果时间间隔重叠,则对行进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59656420/