首頁 > 資料庫 > mysql教程 > SQL RANK() 與 ROW_NUMBER():有什麼不同?

SQL RANK() 與 ROW_NUMBER():有什麼不同?

Mary-Kate Olsen
發布: 2025-01-13 16:52:44
原創
641 人瀏覽過

SQL RANK() vs. ROW_NUMBER(): What's the Difference?

SQL RANK() 與 ROW_NUMBER() 的差異

在使用 SQL 排名函數時,理解 RANK() 和 ROW_NUMBER() 之間的區別至關重要。雖然在某些情況下它們看起來很相似,但在處理重複值時,它們的行為可能會有所不同。

ROW_NUMBER() 與 RANK() 的比較

ROW_NUMBER() 為每一行分配一個連續的整數值,而不管排序列中的值是否相同。這意味著 ROW_NUMBER() 將始終為每一行分配唯一的整數。

另一方面,RANK() 根據行在分區內的排序順序為每一行分配一個排名。具有相同排序值的行將獲得相同的排名。當出現平局時,這會導致排名中出現間隙。

示範

以下 SQL 查詢示範了 ROW_NUMBER() 和 RANK() 之間的差異:

<code class="language-sql">SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle</code>
登入後複製
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>
登入後複製

使用這些查詢,兩個結果集最初看起來相同。但是,如果排序中存在任何平局,則區別就會變得明顯。考慮以下範例資料:

<code class="language-sql">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</code>
登入後複製

結果:

<code>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</code>
登入後複製

在這個例子中,即使存在平局,ROW_NUMBER() 也會遞增,而 RANK() 會為所有平局的行分配相同的排名。 DENSE_RANK() 類似於 RANK(),但會為下一個不同的排序值指派下一個不同的排名 (2)。

以上是SQL RANK() 與 ROW_NUMBER():有什麼不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板