3 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
ROW_NUMBER:返回以1開頭的每一行的唯一編號(hào)。對(duì)于具有重復(fù)值的行,將對(duì)該數(shù)字進(jìn)行仲裁。
排名:為以1開頭的每一行指定唯一編號(hào),但具有重復(fù)值的行除外,在這種情況下,將為每個(gè)重復(fù)排名分配相同的排名并在序列中顯示間隙。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您在特定訂購(gòu)值的分區(qū)中存在關(guān)聯(lián),則只會(huì)看到差異。
RANK并且 DENSE_RANK在這種情況下是確定性的,對(duì)于排序列和分區(qū)列具有相同值的所有行將以相等的結(jié)果結(jié)束,而ROW_NUMBER將任意地(非確定地)將遞增結(jié)果分配給綁定的行。
示例:(所有行都相同,StyleID所以在同一個(gè)分區(qū)中,在該分區(qū)中,前3行在排序時(shí)綁定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
您可以看到,對(duì)于三個(gè)相同的行,ROW_NUMBER增量,RANK值保持相同然后跳到4。DENSE_RANK也為所有三行分配相同的排名,但是下一個(gè)不同的值被賦值為2。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
本文介紹了ROW_NUMBER()和之間有趣的關(guān)系DENSE_RANK()(RANK()函數(shù)沒有特別處理)。當(dāng)您需要ROW_NUMBER()在SELECT DISTINCT語句上生成時(shí),ROW_NUMBER()將在關(guān)鍵字刪除它們之前生成不同的值DISTINCT。例如這個(gè)查詢
SELECT DISTINCT
v,
ROW_NUMBER() OVER (ORDER BY v) row_number
FROM t
ORDER BY v, row_number
...可能會(huì)產(chǎn)生這個(gè)結(jié)果(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
...在這種情況下產(chǎn)生你可能想要的東西:
+---+------------+
| V | ROW_NUMBER |
+---+------------+
| a | 1 |
| b | 2 |
| c | 3 |
| d | 4 |
| e | 5 |
+---+------------+
請(qǐng)注意,函數(shù)的ORDER BY子句DENSE_RANK()將需要子句中的所有其他列SELECT DISTINCT才能正常工作。
這樣做的原因是邏輯上,窗口函數(shù)在DISTINCT應(yīng)用之前計(jì)算。
所有三個(gè)功能相比較
使用PostgreSQL / Sybase / SQL標(biāo)準(zhǔn)語法(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
... 你會(huì)得到:
+---+------------+------+------------+
| 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 |
+---+------------+------+------------+
添加回答
舉報(bào)