了解 SQL 排名函数:Row_Number、Rank 和 Dense_Rank

了解 SQL 排名函数:Row_Number、Rank 和 Dense_Rank

Photo by 卡斯帕卡米尔鲁宾 on 不飞溅

自从我开始学习 SQL 以来,一直很困惑,无法清楚地理解 Ranking Functions 之间的区别。在我看来,这有两个原因:第一个是这些差异很小,但可能会产生很大的影响,第二个是排名函数分配值的窗口,乍一看可能很复杂.

在本文中,我将简要介绍 Ranking Functions 的作用,解释它们的使用并通过示例比较它们的输出。

为什么我们使用排名函数?

由于需要对数据点进行排序以使其更有意义,因此排名函数在 SQL 脚本中被广泛使用。排名的一些用例可以总结如下:

  1. 2022 年第一季度亚马逊上每位用户的订单量
  2. 2021年下半年梅西百货每位员工的销售额
  3. 在不同设备上观看 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

posted @   哈哈哈来了啊啊啊  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示