SQL Server如何按id分组按日期排序后统计同色连续出现次数
问题描述
我使用SQL创建了按相同id分组、按日期排序的rank列,想要统计蓝色、红色、黄色值按顺序的连续重复次数。
原始数据示例
| date | id | color | rank |
|---|---|---|---|
| 202006 | 4 | blue | 1 |
| 202007 | 4 | blue | 2 |
| 202008 | 4 | blue | 3 |
| 202009 | 4 | red | 4 |
| 202010 | 4 | blue | 5 |
| 202011 | 4 | blue | 6 |
| 202012 | 4 | yellow | 7 |
| 202101 | 4 | red | 8 |
| 202102 | 4 | red | 9 |
| 202103 | 4 | blue | 10 |
| 202104 | 4 | blue | 11 |
| 202105 | 4 | blue | 12 |
| 202006 | 8 | blue | 1 |
| 202007 | 8 | yellow | 2 |
| 202008 | 8 | yellow | 3 |
| 202009 | 8 | yellow | 4 |
| 202010 | 8 | yellow | 5 |
| 202011 | 8 | yellow | 6 |
| 202012 | 8 | red | 7 |
| 202101 | 8 | red | 8 |
| 202102 | 8 | blue | 9 |
| 202103 | 8 | blue | 10 |
| 202104 | 8 | blue | 11 |
| 202105 | 8 | blue | 12 |
| 202012 | 9 | yellow | 1 |
| 202101 | 9 | yellow | 2 |
| 202102 | 9 | yellow | 3 |
| 202103 | 9 | blue | 4 |
| 202104 | 9 | red | 5 |
| 202105 | 9 | red | 6 |
解决方法
这是SQL中典型的连续序列(岛屿)统计问题,直接使用窗口函数即可实现需求:
WITH color_group AS ( SELECT *, -- 计算连续同色块的分组标识 [rank] - ROW_NUMBER() OVER(PARTITION BY id, color ORDER BY [rank]) AS grp FROM your_table -- 替换为你自己的实际表名 ) SELECT date, id, color, [rank], -- 同连续块内的行号即为连续重复次数 ROW_NUMBER() OVER(PARTITION BY id, color, grp ORDER BY [rank]) AS repetitions FROM color_group ORDER BY id, [rank]
逻辑说明
- 第一层CTE中,按
id和color分组计算每条记录的内部行号,用原有全局rank减去这个行号,得到的值对于连续出现的同颜色记录是相同的,以此作为连续同色块的唯一标识 - 第二层查询中,按
id、color和上面得到的分组标识grp再次分组,组内按rank排序生成的行号,就是对应颜色的连续重复次数
内容的提问来源于stack exchange,提问作者fasantos
相关产品推荐
相关产品推荐

