我需要一个SQL查询来创建一个新字段group_id,该字段标识每个ID中具有重叠的start_timeend_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_timeend_time之间时,记录A与另一个记录B重叠。

在示例中,ID = 100有四个间隔。前三个重叠=>第二条记录与第一条重叠(10:15的start_time在10:00至12:00的start_timeend_time之间),第三条与第二条记录重叠( 12:15的start_time在10:15到12:30的start_timeend_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/

10-15 11:20