SQL Server 2019中如何为每个ID下的GroupID分配连续分组编号
解决方案
要实现每个ID下按GroupID分配连续的Group Number,使用DENSE_RANK()函数结合正确的分区与排序逻辑即可,无需使用运行值。
完整SQL代码
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID, GROUPID ORDER BY line) AS RankByID_GroupID, DENSE_RANK() OVER (PARTITION BY ID ORDER BY MIN(line) OVER (PARTITION BY ID, GroupID)) AS [Group Number] FROM #t ORDER BY ID, line;
代码说明
RankByID_GroupID:保留你原有的逻辑,按ID和GroupID分区,对同一组内的行按line生成连续编号。Group Number:- 先通过
MIN(line) OVER (PARTITION BY ID, GroupID)获取每个ID下各GroupID对应的最小行号,以此确定该GroupID在当前ID中的出现顺序。 - 再用
DENSE_RANK()按ID分区,基于上述最小行号排序,生成连续的组编号——同一个GroupID的所有行将获得相同编号,不同GroupID按出现顺序依次递增。
- 先通过
执行结果
| ID | Risk_Name | line | GroupID | RankByID_GroupID | Group Number |
|---|---|---|---|---|---|
| 1234 | American 1 | 1 | 10 | 1 | 1 |
| 1234 | Asian 21 | 2 | 20 | 1 | 2 |
| 1234 | Asian 24 | 3 | 20 | 2 | 2 |
| 1234 | Asian 28 | 4 | 20 | 3 | 2 |
| 1234 | Europe 300 | 5 | 30 | 1 | 3 |
| 1234 | Europe 388 | 6 | 30 | 2 | 3 |
| 88888 | American 2 | 1 | 10 | 1 | 1 |
| 88888 | American 4 | 2 | 10 | 2 | 1 |
| 88888 | Europe 33 | 3 | 30 | 1 | 2 |
内容的提问来源于stack exchange,提问作者user1982778
相关产品推荐
相关产品推荐

