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