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中文网其他相关文章!