gpt4 book ai didi

sql - 排名:如何将 ROW_NUMBER 或 RANK 重置为 1

转载 作者:行者123 更新时间:2023-12-02 00:50:32 26 4
gpt4 key购买 nike

使用 SQL Server 2014:

考虑下表:

DECLARE @Table TABLE (
Id int NOT NULL identity(1,1),
Col_Value varchar(2)
)

INSERT INTO @Table (Col_Value)
VALUES ('A'),('A'),('B'),('B'),('B'),('A'),('A'),('B'),('B'),('B'),('A'),('B'),('B'),('A'),('A'),('B'),('C'),('C'),('A'),('A'),('B'),('B'),('C')

如何创建一个在结果中生成 R 列的查询,如下所示

+----+------+---+
| ID | Data | R |
+----+------+---+
| 1 | A | 1 |
+----+------+---+
| 2 | A | 2 |
+----+------+---+
| 3 | B | 1 |
+----+------+---+
| 4 | B | 2 |
+----+------+---+
| 5 | B | 3 |
+----+------+---+
| 6 | A | 1 |
+----+------+---+
| 7 | A | 2 |
+----+------+---+
| 8 | B | 1 |
+----+------+---+
| 9 | B | 2 |
+----+------+---+
| 10 | B | 3 |
+----+------+---+
| 11 | A | 1 |
+----+------+---+
| 12 | B | 1 |
+----+------+---+
| 13 | B | 2 |
+----+------+---+
| 14 | A | 1 |
+----+------+---+
| 15 | A | 2 |
+----+------+---+
| 16 | B | 1 |
+----+------+---+
| 17 | C | 1 |
+----+------+---+
| 18 | C | 2 |
+----+------+---+
| 19 | A | 1 |
+----+------+---+
| 20 | A | 2 |
+----+------+---+
| 21 | B | 1 |
+----+------+---+
| 22 | B | 2 |
+----+------+---+
| 23 | C | 1 |
+----+------+---+

在上面的结果表中,一旦一行中的Data列发生变化,R值就重置为1

更新 1

Ben Thul 的回答非常有效。

我建议引用这个答案更新下面的帖子。

T-sql Reset Row number on Field Change

最佳答案

这在文献中被称为“差距和孤岛”问题。首先,我提出的解决方案:

with cte as (
select *, [Id] - row_number() over (partition by [Col_Value] order by [Id]) as [GroupID]
from @table
)
select [Id], [Col_Value], row_number() over (partition by [GroupID], [Col_Value] order by [Id])
from cte
order by [Id];

为了说明,请注意,如果我使用 row_number() 枚举所有“A”值,那些连续的值将在 row_number() 上升与 Id 值相同的速率。也就是说,对于那个相邻的组(也称为“岛”)中的那些,它们的差异是相同的。一旦我们计算出该组标识符,只需枚举每个组的每个成员即可。

关于sql - 排名:如何将 ROW_NUMBER 或 RANK 重置为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40353267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com