SQL Server查询中对连续groupid分组生成唯一递增新组ID的实现方案
SQL Server 实现连续同groupid分组生成递增newGroupId
需求说明
现有包含uid、groupid两个字段的表,需要按照uid升序排序后,将连续出现的相同groupid划分为同一个新组,生成唯一递增的newGroupId字段。
实现思路
这是典型的序列孤岛问题,通过两次窗口函数即可实现:
- 用
LAG()窗口函数获取按uid排序后上一行的groupid值 - 标记当前行
groupid与上一行是否不同,不同则记为1,相同记为0 - 对标记值做累加求和,得到的结果就是递增的
newGroupId
实现代码
-- 请将代码中的user_group替换为你的实际表名 WITH lag_cte AS ( SELECT uid, groupid, LAG(groupid, 1, -1) OVER (ORDER BY uid) AS prev_groupid FROM user_group ), flag_cte AS ( SELECT uid, groupid, CASE WHEN groupid != prev_groupid THEN 1 ELSE 0 END AS change_flag FROM lag_cte ) SELECT uid, groupid, SUM(change_flag) OVER (ORDER BY uid ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1 AS newGroupId FROM flag_cte ORDER BY uid;
输出验证
执行上述代码后输出结果和预期完全匹配:
| uid | groupid | newGroupId |
|---|---|---|
| 1 | 0 | 0 |
| 2 | 0 | 0 |
| 3 | 1 | 1 |
| 4 | 1 | 1 |
| 5 | 1 | 1 |
| 6 | 1 | 1 |
| 7 | 0 | 2 |
| 8 | 0 | 2 |
| 9 | 2 | 3 |
| 10 | 2 | 3 |
| 11 | 2 | 3 |
内容的提问来源于stack exchange,提问作者Simon Greener
相关产品推荐
相关产品推荐

