了解 SQL 排名函数:Row_Number、Rank 和 Dense_Rank
自从我开始学习 SQL 以来,一直很困惑,无法清楚地理解 Ranking Functions 之间的区别。在我看来,这有两个原因:第一个是这些差异很小,但可能会产生很大的影响,第二个是排名函数分配值的窗口,乍一看可能很复杂.
在本文中,我将简要介绍 Ranking Functions 的作用,解释它们的使用并通过示例比较它们的输出。
为什么我们使用排名函数?
由于需要对数据点进行排序以使其更有意义,因此排名函数在 SQL 脚本中被广泛使用。排名的一些用例可以总结如下:
- 2022 年第一季度亚马逊上每位用户的订单量
- 2021年下半年梅西百货每位员工的销售额
- 在不同设备上观看 Netflix 节目所花费的时间
ROW_NUMBER()
ROW_NUMBER() 是 SQL 世界中最常见的排名函数。它为提供的窗口中的每一行分配序列号。 如果有重复,它不允许排名平局。 这就是为什么 ROW_NUMBER() 不能保证输出中的关系顺序相同。
句法:
ROW_NUMBER ( ) OVER ( PARTITION BY Column 1 ORDER BY Column 2)
如果 2nd 和 3rd 排名平局,则样本输出:[1, 2, 3, 4, 5, 6]
秩()
RANK() 本质上与 ROW_NUMBER() 类似,不同之处在于允许排名重复。换句话说,与 ROW_NUMBER() 不同,RANK() 为平局分配相同的排名,同时在平局后跳到下一个排名。
句法:
RANK ( ) OVER(按第 1 列分区按第 2 列排序)
如果 2nd 和 3rd 排名平局,则样本输出:[1, 2, 2, 4, 5, 6]
DENSE_RANK()
DENSE_RANK() 与 RANK() 非常相似,因为它允许重复。但是 DENSE_RANK() 在平局后不会跳到下一个排名,而是使用下一个排名。
句法:
DENSE_RANK ( ) OVER ( PARTITION BY Column 1 ORDER BY Column 2)
如果 2nd 和 3rd 排名平局,则样本输出:[1, 2, 2, 3, 4, 5]
排名函数注意事项:
- 第 1 列是创建窗口的字段(每人、每周、每台设备等),第 2 列是顺序分配的依据。
- Order BY 在 Ranking Functions 中默认为升序。您可以在第 2 列之后添加 DESC 以使其降序。
- PARTITION BY 在排名函数中不是强制性的。但是,如果您使用的是真实数据,则很可能需要将数据集划分为多个分区才能更好地理解。
上图来自数据专家和影响者 Jess Ramos。她通过一个简单的示例描述了 ROW_NUMBER()、RANK() 和 DENSE_RANK() 之间的输出差异,而没有涉及 PARTITION BY aka 窗口的复杂性。正如所见,ROW_NUMBER() 不允许按顺序重复,而 RANK() 和 DENSE_RANK() 允许。 RANK() 在平局后跳过排名,但 DENSE_RANK() 不跳过并使用下一个排名号。
最后的话
如果您不清楚它们的细微差异,排名函数可能会令人沮丧。在本文中,我对 ROW_NUMBER()、RANK() 和 DENSE_RANK() 函数进行了比较和对比,详细阐述了它们的区别,并以一个例子结束。
参考:
微软官方文档: https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver16
杰西·拉莫斯的视觉效果: https://www.linkedin.com/in/jessramosmsba/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/37542/12051810
标签:Dense,Number,RANK,NUMBER,Rank,DENSE,排名,平局,ROW From: https://www.cnblogs.com/amboke/p/16704299.html