使用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;
代码说明:
continuous_groupsCTE:- 用
LAG(EndDate) OVER (PARTITION BY ID ORDER BY StartDate)获取同一ID下上一条记录的EndDate - 通过
CASE判断当前记录的StartDate是否与上一条的EndDate相等,标记是否为新组的开始 - 用累加
SUM生成每个连续时段的group_id,同一连续时段的记录会拥有相同的group_id
- 用
group_totalsCTE:- 按
ID和group_id分组,计算每个连续时段的Days总和
- 按
最终查询:
- 按
ID分组,取每个ID对应的最大连续时段天数总和
- 按
示例结果:
针对你提供的示例数据,执行上述SQL后会输出:
| ID | Days |
|---|---|
| 121 | 5 |
内容的提问来源于stack exchange,提问作者Lucidity
相关产品推荐
相关产品推荐

