首页 > 数据库 > mysql教程 > SQL RANK() 与 ROW_NUMBER():它们在处理关系时有何不同?

SQL RANK() 与 ROW_NUMBER():它们在处理关系时有何不同?

Susan Sarandon
发布: 2025-01-13 16:56:43
原创
895 人浏览过

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

SQL RANK() 与 ROW_NUMBER(): 差异详解

在 SQL 中,RANK() 和 ROW_NUMBER() 功能相似,容易混淆。然而,理解它们细微的差别对于有效的数据操作至关重要。

RANK() 与 ROW_NUMBER() 的比较

RANK() 为分区内具有相同排序值的行列分配相同的排名,而 ROW_NUMBER() 始终递增,即使对于具有相同值的行列也是如此。

关键差异:处理重复值

RANK() 和 ROW_NUMBER() 之间的主要区别在于它们在遇到分区内重复值时的行为:

  • RANK(): 为重复值的行分配相同的排名。
  • ROW_NUMBER(): 为重复值的行任意分配递增的排名。

示例

考虑以下表格:

StyleID ID Description
1 1 Item A
1 1 Item B
1 1 Item C
1 2 Item D

使用以下查询:

<code class="language-sql">SELECT ID, Description, RANK() OVER (PARTITION BY StyleID ORDER BY ID) AS 'Rank' FROM SubStyle;
SELECT ID, Description, ROW_NUMBER() OVER (PARTITION BY StyleID ORDER BY ID) AS 'RowNumber' FROM SubStyle;</code>
登录后复制

只有在分区内没有重复值时,才能获得相同的结果。例如,如果您添加另一行,其中 StyleID 为 3,ID 为 1,您将观察到以下结果:

StyleID ID Description Rank RowNumber
1 1 Item A 1 1
1 1 Item B 1 2
1 1 Item C 1 3
1 2 Item D 4 4
3 1 New Item 1 5

如您所见,对于 StyleID 为 3 的唯一值,ROW_NUMBER() 分配递增的数字,而 RANK() 为其分配与 StyleID 为 1 的重复值行相同的排名。

结论

RANK() 和 ROW_NUMBER() 服务于不同的目的。RANK() 用于对组内的唯一值进行排名,适当地处理重复值。另一方面,ROW_NUMBER() 始终递增,确保每一行都有一个不同的数值,即使对于重复值的行也是如此。在使用 SQL 数据时,理解这些差异对于做出明智的决策至关重要。

以上是SQL RANK() 与 ROW_NUMBER():它们在处理关系时有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板