如何按连续相同statusid分组并获取对应日期区间?
实现连续相同statusid的时间区间合并
要解决这个问题,核心是识别连续相同statusid的行组,而非将所有相同statusid的行合并。可以通过SQL窗口函数实现,具体步骤如下:
步骤1:标记新分组的起始行
用LAG()函数获取当前行的上一行statusid,判断当前行是否属于新分组(即与上一行statusid不同):
SELECT seq, statusid, date1, date2, -- 若当前行与上一行statusid不同,标记为新分组起始(1),否则标记为0 CASE WHEN LAG(statusid) OVER (ORDER BY seq) = statusid THEN 0 ELSE 1 END AS is_new_group FROM your_table;
步骤2:生成分组ID
通过累加is_new_group的值,为每个连续相同的statusid行分配唯一的分组ID:
SELECT *, -- 按seq排序累加is_new_group,得到连续行的分组ID SUM(is_new_group) OVER (ORDER BY seq) AS group_id FROM ( SELECT seq, statusid, date1, date2, CASE WHEN LAG(statusid) OVER (ORDER BY seq) = statusid THEN 0 ELSE 1 END AS is_new_group FROM your_table ) t1;
步骤3:按分组聚合时间区间
最后按分组ID和statusid聚合,取每组的最早date1和最晚date2:
SELECT statusid, MIN(date1) AS start_date, MAX(date2) AS end_date FROM ( SELECT *, SUM(is_new_group) OVER (ORDER BY seq) AS group_id FROM ( SELECT seq, statusid, date1, date2, CASE WHEN LAG(statusid) OVER (ORDER BY seq) = statusid THEN 0 ELSE 1 END AS is_new_group FROM your_table ) t1 ) t2 GROUP BY group_id, statusid ORDER BY MIN(seq); -- 按原seq顺序输出结果
这个方法会把连续相同的statusid行合并为一组,不连续的相同statusid会被分成不同组,比如你提到的statusid=2两次出现的情况,会生成两个独立的时间区间结果。
内容的提问来源于stack exchange,提问作者Derek Jee
相关产品推荐
相关产品推荐

