使用分区统计连续值:Gaps and Islands问题实操求助
Gaps and Islands 连续状态统计问题解法
你当前代码的核心问题是仅按Status字段分组,会把所有状态相同的行合并,自然无法拆分出前后两段独立的Passed分组,也统计不出各段的连续长度。
这类连续区间统计的经典解法是生成「连续相同状态的分组标识」,具体实现SQL如下:
SELECT ROW_NUMBER() OVER(ORDER BY MIN([Step Number])) AS [Order], Status, COUNT(*) AS [Consecutive Counts] FROM ( SELECT [Step Number], Status, -- 生成连续相同状态的唯一分组ID [Step Number] - ROW_NUMBER() OVER(PARTITION BY Status ORDER BY [Step Number]) AS grp_id FROM Q1 ) t GROUP BY Status, grp_id ORDER BY [Order]
逻辑说明
- 内层查询生成的
grp_id是核心:相同连续状态的行,全局步长Step Number和同状态分区内的行号都是每次+1,差值固定;一旦状态切换,同状态分区的行号会重新从1开始计数,差值就会发生变化,刚好可以把不同段的相同状态区分开。 - 外层分组同时按
Status和grp_id两个字段分组,就能把两段Passed拆成独立的两个分组,用COUNT(*)直接统计每个分组的行数,就是对应段的连续次数。 - 排序时取每个分组最小的
Step Number作为排序依据,保证生成的Order序号和实际步骤的先后顺序一致。
内容的提问来源于stack exchange,提问作者markSS
相关产品推荐
相关产品推荐

