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

使用SQL语句按客户维度合并连续日期范围

需求说明

按客户、状态维度合并Sospensioni表中连续的日期区间:若前一个区间的结束日期与后一个区间的开始日期相邻(即后段开始日期 = 前段结束日期+1天),则将两段合并为一个区间,取区间内最早的开始日期、最晚的结束日期;不连续的区间独立保留。

测试表信息

表名:Sospensioni,原始测试数据如下:

ClientIdStatusStartDateEndDate
1101/01/202202/01/2022
1103/01/202204/01/2022
1112/01/202215/01/2022
2103/01/202203/01/2022
2105/01/202206/01/2022
预期返回结果
ClientIdStatusStartDateEndDate
1101/01/202204/01/2022
1112/01/202215/01/2022
2103/01/202203/01/2022
2105/01/202206/01/2022
实现方案

采用经典的间断孤岛(Gaps and Islands)解法,通过窗口函数标记连续区间的分组ID,再按分组聚合即可,兼容所有支持窗口函数的主流数据库(MySQL8.0+、PostgreSQL、SQL Server等)。

核心代码(以MySQL语法为例)

WITH interval_group AS (
    SELECT
        ClientId,
        Status,
        StartDate,
        EndDate,
        -- 遇到不连续的日期则新增分组,累计求和生成连续区间的唯一ID
        SUM(
            CASE WHEN StartDate = DATE_ADD(
                LAG(EndDate) OVER (PARTITION BY ClientId, Status ORDER BY StartDate),
                INTERVAL 1 DAY
            ) THEN 0 ELSE 1 END
        ) OVER (PARTITION BY ClientId, Status ORDER BY StartDate) AS grp_id
    FROM Sospensioni
)
SELECT
    ClientId,
    Status,
    MIN(StartDate) AS StartDate,
    MAX(EndDate) AS EndDate
FROM interval_group
GROUP BY ClientId, Status, grp_id
ORDER BY ClientId, StartDate;

语法适配提示:如果使用PostgreSQL,日期偏移写法替换为LAG(EndDate) OVER (...) + INTERVAL '1 day';如果使用SQL Server,替换为DATEADD(day, 1, LAG(EndDate) OVER (...))即可,核心分组逻辑完全一致。

内容的提问来源于stack exchange,提问作者i87ce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:06:36