You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按连续相同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:50:09