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中文網其他相關文章!