亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL RANK()與ROW_NUMBER()

SQL RANK()與ROW_NUMBER()

慕絲7291255 2019-09-19 09:20:00
我對這些之間的差異感到困惑。運行以下SQL會獲得兩個完美的結果集。有人可以解釋一下這些差異嗎?SELECT ID, [Description], RANK()       OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank'      FROM SubStyleSELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle
查看完整描述

3 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

ROW_NUMBER:返回以1開頭的每一行的唯一編號。對于具有重復值的行,將對該數字進行仲裁。

排名:為以1開頭的每一行指定唯一編號,但具有重復值的行除外,在這種情況下,將為每個重復排名分配相同的排名并在序列中顯示間隙。


查看完整回答
反對 回復 2019-09-19
?
拉莫斯之舞

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。


查看完整回答
反對 回復 2019-09-19
?
幕布斯6054654

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 |

+---+------------+------+------------+


查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 1397 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號