首页 >数据库 >mysql教程 >SQL RANK() 与 ROW_NUMBER():有什么区别?

SQL RANK() 与 ROW_NUMBER():有什么区别?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-13 16:52:44643浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn