基于时间间隔合并连续时段:SQL真实起止时间分组查询
需求:编写SQL查询合并连续无间隔的时段
实现目标:基于时间间隔对start_time和end_time分组,识别无间隔衔接的连续时段,为每条原始记录匹配对应连续时段的real_start(时段起始)和real_end(时段结束);最终得到去重后的分组结果,仅保留不同时段的真实起止时间。
输入数据
| ID | start_time | end_time |
|---|---|---|
| 1 | 08:00:00 | 08:05:00 |
| 1 | 08:05:00 | 09:55:00 |
| 1 | 09:55:00 | 10:15:00 |
| 1 | 10:15:00 | 11:03:00 |
| 1 | 11:03:00 | 12:01:00 |
| 1 | 13:02:00 | 13:44:00 |
| 1 | 14:44:00 | 14:55:00 |
| 1 | 14:55:00 | 15:03:00 |
| 1 | 15:03:00 | 17:00:00 |
预期中间输出
| ID | start_time | end_time | real_start | real_end |
|---|---|---|---|---|
| 1 | 08:00:00 | 08:05:00 | 08:00:00 | 12:01:00 |
| 1 | 08:05:00 | 09:55:00 | 08:00:00 | 12:01:00 |
| 1 | 09:55:00 | 10:15:00 | 08:00:00 | 12:01:00 |
| 1 | 10:15:00 | 11:03:00 | 08:00:00 | 12:01:00 |
| 1 | 11:03:00 | 12:01:00 | 08:00:00 | 12:01:00 |
| 1 | 13:02:00 | 13:44:00 | 13:02:00 | 13:44:00 |
| 1 | 14:44:00 | 14:55:00 | 14:44:00 | 17:00:00 |
| 1 | 14:55:00 | 15:03:00 | 14:44:00 | 17:00:00 |
| 1 | 15:03:00 | 17:00:00 | 14:44:00 | 17:00:00 |
预期最终输出
| ID | real_start | real_end |
|---|---|---|
| 1 | 08:00:00 | 12:01:00 |
| 1 | 13:02:00 | 13:44:00 |
| 1 | 14:44:00 | 17:00:00 |
SQL实现方案
核心思路
利用窗口函数标记连续时段的分组,再通过分组聚合计算每个连续时段的真实起止时间,最后按需输出中间或最终结果。
完整SQL代码
WITH grouped_data AS ( SELECT ID, start_time, end_time, -- 当当前记录的start_time与上一条的end_time不衔接时,生成新分组标识 SUM(CASE WHEN start_time != LAG(end_time) OVER (PARTITION BY ID ORDER BY start_time) THEN 1 ELSE 0 END) OVER (PARTITION BY ID ORDER BY start_time) AS group_id FROM your_table_name -- 替换为实际表名 ), interval_summary AS ( SELECT ID, group_id, MIN(start_time) AS real_start, MAX(end_time) AS real_end FROM grouped_data GROUP BY ID, group_id ) -- 选择输出类型: -- 1. 若要获取中间输出,注释下面的SELECT,启用下方的JOIN查询 -- SELECT -- gd.ID, -- gd.start_time, -- gd.end_time, -- isum.real_start, -- isum.real_end -- FROM grouped_data gd -- JOIN interval_summary isum ON gd.ID = isum.ID AND gd.group_id = isum.group_id -- ORDER BY gd.ID, gd.start_time; -- 2. 若要获取最终去重结果,执行以下SELECT SELECT ID, real_start, real_end FROM interval_summary ORDER BY ID, real_start;
内容的提问来源于stack exchange,提问作者JEYA PRAKASH
相关产品推荐
相关产品推荐

