3 回答

TA貢獻1856條經驗 獲得超5個贊
ROW_NUMBER:返回以1開頭的每一行的唯一編號。對于具有重復值的行,將對該數字進行仲裁。
排名:為以1開頭的每一行指定唯一編號,但具有重復值的行除外,在這種情況下,將為每個重復排名分配相同的排名并在序列中顯示間隙。

TA貢獻1820條經驗 獲得超10個贊
如果您在特定訂購值的分區中存在關聯,則只會看到差異。
RANK并且 DENSE_RANK在這種情況下是確定性的,對于排序列和分區列具有相同值的所有行將以相等的結果結束,而ROW_NUMBER將任意地(非確定地)將遞增結果分配給綁定的行。
示例:(所有行都相同,StyleID所以在同一個分區中,在該分區中,前3行在排序時綁定ID)
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
返回
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
您可以看到,對于三個相同的行,ROW_NUMBER增量,RANK值保持相同然后跳到4。DENSE_RANK也為所有三行分配相同的排名,但是下一個不同的值被賦值為2。

TA貢獻1876條經驗 獲得超7個贊
本文介紹了ROW_NUMBER()和之間有趣的關系DENSE_RANK()(RANK()函數沒有特別處理)。當您需要ROW_NUMBER()在SELECT DISTINCT語句上生成時,ROW_NUMBER()將在關鍵字刪除它們之前生成不同的值DISTINCT。例如這個查詢
SELECT DISTINCT
v,
ROW_NUMBER() OVER (ORDER BY v) row_number
FROM t
ORDER BY v, row_number
...可能會產生這個結果(DISTINCT沒有效果):
+---+------------+
| V | ROW_NUMBER |
+---+------------+
| a | 1 |
| a | 2 |
| a | 3 |
| b | 4 |
| c | 5 |
| c | 6 |
| d | 7 |
| e | 8 |
+---+------------+
鑒于此查詢:
SELECT DISTINCT
v,
DENSE_RANK() OVER (ORDER BY v) row_number
FROM t
ORDER BY v, row_number
...在這種情況下產生你可能想要的東西:
+---+------------+
| V | ROW_NUMBER |
+---+------------+
| a | 1 |
| b | 2 |
| c | 3 |
| d | 4 |
| e | 5 |
+---+------------+
請注意,函數的ORDER BY子句DENSE_RANK()將需要子句中的所有其他列SELECT DISTINCT才能正常工作。
這樣做的原因是邏輯上,窗口函數在DISTINCT應用之前計算。
所有三個功能相比較
使用PostgreSQL / Sybase / SQL標準語法(WINDOW子句):
SELECT
v,
ROW_NUMBER() OVER (window) row_number,
RANK() OVER (window) rank,
DENSE_RANK() OVER (window) dense_rank
FROM t
WINDOW window AS (ORDER BY v)
ORDER BY v
... 你會得到:
+---+------------+------+------------+
| V | ROW_NUMBER | RANK | DENSE_RANK |
+---+------------+------+------------+
| a | 1 | 1 | 1 |
| a | 2 | 1 | 1 |
| a | 3 | 1 | 1 |
| b | 4 | 4 | 2 |
| c | 5 | 5 | 3 |
| c | 6 | 5 | 3 |
| d | 7 | 7 | 4 |
| e | 8 | 8 | 5 |
+---+------------+------+------------+
添加回答
舉報