首页 > 数据库 >了解 SQL 排名函数:Row_Number、Rank 和 Dense_Rank

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

时间:2022-09-18 10:23:15浏览次数:100  
标签:Dense Number RANK NUMBER Rank DENSE 排名 平局 ROW

了解 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

标签:Dense,Number,RANK,NUMBER,Rank,DENSE,排名,平局,ROW
From: https://www.cnblogs.com/amboke/p/16704299.html

相关文章

  • CF1352A - Sum of Round Numbers
    CF1352A-SumofRoundNumbersA.SumofRoundNumbersApositive(strictlygreaterthanzero)integeriscalledroundifitisoftheformd00...0.Inotherw......
  • number.js说明
    文件说明:数字类操作集合示例代码: import$numberfrom'@/common/js/string.js'$number.isNumber('12345') 方法列表:@name $number.isNumber(value)@......
  • LeetCode136. Single Number
    题意给出一个数组,只存在一个数出现一次,其余数均出现两次,求出现一次的数方法a^a^b=b代码classSolution{public:intsingleNumber(vector<int>&nums)......
  • Maximum Number of Robots Within Budget
    MaximumNumberofRobotsWithinBudgetYouhave$n$robots.Youaregiventwo0-indexedintegerarrays, chargeTimes and runningCosts ,bothoflength$n$.......
  • mt19937_64 get random numbers
    #include<ctime>#include<iostream>#include<random>usingnamespacestd;voiduInt32Array(intlen);intmain(intargs,char**argv){uInt32Array(a......
  • SQL经典用法:开窗函数之LEAD() OVER()和ROW_NUMBER() OVER()
    案例需求:求哪些店铺的电子类产品连续3个月增长shop month dz fz spa,2019-01,3000,5000,2000a,2019-02,6000,4000,3000b,2019-01,3000,5000,2000b,2019-02,60......
  • *Codeforces Round #651 (Div. 2) C. Number Game(博弈论)
    https://codeforces.com/contest/1370/problem/CAshishgup和FastestFinger玩游戏。他们从数字n开始,轮流玩。在每个回合中,玩家可以进行以下任意一个动作:将n除以任何大......
  • CF55D Beautiful numbers
    求\([l,r]\)中满足\(x\)能被\(x\)数位中所有非\(0\)位整除的数的个数。\(l,r\leq9\times10^{18}\)。\(lcm(1\sim9)=2520\)。标准的数位DP。用\(dp[i][j][k......
  • CF446C DZY Loves Fibonacci Numbers
    CF446CDZYLovesFibonacciNumbers题目大意在本题中,我们用\(f_i\)来表示第\(i\)个斐波那契数(\(f_1=f_2=1,f_i=f_{i-1}+f_{i-2}(i\ge3)\))。维护一个序列\(a\),长......
  • Hackerrank 编码挑战
    Hackerrank编码挑战昨天,我在Hackerrank平台遇到了一个问题,需要作为结对编程挑战的一部分来解决。与大家分享问题和解决方案。亚历克斯的一个朋友赠送了一个电影收藏,......