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

使用Partition By编写SQL查询,获取连续时段的最大天数总和

计算连续时段天数总和最大值的SQL实现

针对需求——统计连续时段(当前记录的EndDate等于下一条记录的StartDate)的Days总和,并取每个ID对应的最大值,可通过窗口函数实现,以下是通用SQL方案:

假设你的表名为periods,执行以下查询即可完成统计:

WITH continuous_groups AS (
    SELECT 
        ID,
        StartDate,
        EndDate,
        Days,
        -- 标记当前记录是否属于新的连续组
        CASE WHEN LAG(EndDate) OVER (PARTITION BY ID ORDER BY StartDate) = StartDate 
             THEN 0 
             ELSE 1 
        END AS is_new_group,
        -- 生成连续组的唯一标识
        SUM(CASE WHEN LAG(EndDate) OVER (PARTITION BY ID ORDER BY StartDate) = StartDate 
                 THEN 0 
                 ELSE 1 
            END) OVER (PARTITION BY ID ORDER BY StartDate) AS group_id
    FROM periods
),
group_totals AS (
    SELECT 
        ID,
        SUM(Days) AS total_days
    FROM continuous_groups
    GROUP BY ID, group_id
)
SELECT 
    ID,
    MAX(total_days) AS Days
FROM group_totals
GROUP BY ID;

代码说明:

  1. continuous_groups CTE:

    • 用LAG(EndDate) OVER (PARTITION BY ID ORDER BY StartDate)获取同一ID下上一条记录的EndDate
    • 通过CASE判断当前记录的StartDate是否与上一条的EndDate相等,标记是否为新组的开始
    • 用累加SUM生成每个连续时段的group_id,同一连续时段的记录会拥有相同的group_id
  2. group_totals CTE:

    • 按ID和group_id分组,计算每个连续时段的Days总和
  3. 最终查询:

    • 按ID分组,取每个ID对应的最大连续时段天数总和

示例结果:

针对你提供的示例数据,执行上述SQL后会输出:

IDDays
1215

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:58