2016-11-01 49 views
1

使用SQL Server 2014:排行:如何將ROW_NUMBER或等級重置爲1

考慮下表:

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 | 
+----+------+---+ 

在上述結果表中,一旦在一排數據列的變化,R值復位到1

更新1

本圖爾的答案效果很好。

我建議下面的帖子更新時參考這個答案。

T-sql Reset Row number on Field Change

+0

Row_number()over(按ID以數據順序劃分的分區) – dman2306

+0

@ dman2306,而不是來自您的查詢的結果遠離帖子中列出的輸出。 –

+0

@artm,您所指的帖子沒有確認的答案。此外,答案似乎僅限於較早版本的SQL Server。我期望SQL 14在這裏提供一個乾淨的解決方案。 –

回答

4

這被稱爲在文獻中一個「空白和島嶼」的問題。首先,我所提出的解決方案:

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值上去。也就是說,它們的區別對於那些連續組(也稱爲「島」)中的差異將是相同的。一旦我們計算出該組標識符,這只是列舉每個組的每個成員的問題。

相關問題