SQL Server如何统计指定字段连续出现的相同数据的次数
SQL Server统计字段值连续出现次数解决方案
这是典型的数据孤岛类计算问题,用SQL Server内置的窗口函数即可快速实现,具体方案如下:
前置假设
我们假设你存储数据的表名为DemoTable,包含两个核心字段:
ID:自增有序字段,用来确定行的先后顺序(如果你的业务中连续的判定基于创建时间等其他字段,替换为对应字段即可)NAME:要统计连续出现次数的目标字段
核心实现逻辑
连续出现的相同NAME值可以通过两次行号的差值分组实现:
- 对全表按顺序字段排序,生成全局行号
- 按
NAME分组,组内按顺序字段排序生成分组行号 - 同一个连续区间的相同
NAME值,两个行号的差值是固定的,按这个差值+NAME分组即可统计连续次数
完整查询代码
WITH CTE AS ( SELECT ID, NAME, -- 全局行号,按ID排序保证行顺序符合业务要求 ROW_NUMBER() OVER (ORDER BY ID) AS GlobalRN, -- 按NAME分组后的组内行号 ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ID) AS GroupRN FROM DemoTable ) SELECT NAME AS 目标值, MIN(ID) AS 连续区间起始ID, MAX(ID) AS 连续区间结束ID, COUNT(*) AS 连续出现次数 FROM CTE -- 差值相同的行属于同一个连续区间 GROUP BY NAME, (GlobalRN - GroupRN) -- 可按需增加筛选条件,比如只查Shyam连续出现3次的记录 -- HAVING COUNT(*) = 3 AND NAME = 'Shyam' ORDER BY MIN(ID)
效果说明
如果你的原始数据如下:
| ID | NAME |
|---|---|
| 1 | Ram |
| 2 | Shyam |
| 3 | Shyam |
| 4 | Shyam |
| 5 | Hari |
| 6 | Shyam |
执行查询后会返回结果:
| 目标值 | 连续区间起始ID | 连续区间结束ID | 连续出现次数 |
|---|---|---|---|
| Ram | 1 | 1 | 1 |
| Shyam | 2 | 4 | 3 |
| Hari | 5 | 5 | 1 |
| Shyam | 6 | 6 | 1 |
刚好匹配你示例中ID=2开始Shyam连续出现3次的需求,放开HAVING条件的注释即可直接筛选出这条记录。
优化提示
如果你的ID是无断号的连续自增主键,可以省略全局行号的计算,直接用ID代替GlobalRN,分组条件改为GROUP BY NAME, (ID - GroupRN),查询性能更高。
内容的提问来源于stack exchange,提问作者Nishan Dhungana
相关产品推荐
相关产品推荐

