首頁 > 資料庫 > mysql教程 > SQL RANK() 與 ROW_NUMBER():處理綁定行時它們有何不同?

SQL RANK() 與 ROW_NUMBER():處理綁定行時它們有何不同?

Patricia Arquette
發布: 2025-01-13 17:01:42
原創
823 人瀏覽過

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

SQL RANK() 與 ROW_NUMBER() 的差異

SQL 中 RANK() 和 ROW_NUMBER() 函數的差異點常常讓開發者感到困惑。雖然提供的 SQL 查詢語句在初始階段看起來可能產生相同的結果,但在存在同值的情況下,它們的運行結果會有所不同。

深入探討差異

RANK() 和 ROW_NUMBER() 函數的關鍵差異在於它們處理同值的方式。 RANK() 及其對應的 DENSE_RANK() 函數表現出確定性行為。當多行在分區列和排序列上具有相同的值時,它們會被賦予相同的排名。

相反,ROW_NUMBER() 即使對於同值行也會指派遞增的結果值。這種行為是非確定性的,這意味著結果集中同值行的順序可能任意變化。

範例說明

考慮以下場景:所有行共享相同的 StyleID,形成一個分區。在該分區內,前三行在按 ID 排序時是同值的。

<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() 則為這三行同值行分配相同的排名。 DENSE_RANK() 的行為與 RANK() 類似,但它將下一個不同的值 2 指派給後續行,以避免排名序列中出現空缺。

以上是SQL RANK() 與 ROW_NUMBER():處理綁定行時它們有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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