SQL之排名窗口函数RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)

现有一张student 表,表中包含id、uname、age、score 四个字段,如下所示:

该表的数据如下所示:

一、ROW_NUMBER()

1、概念

ROW_NUMBER() 为结果集中的每一行分配一个唯一的连续整数,编号从 1 开始。‌ 该函数按照指定的顺序进行排序,即使存在相同的值,每一行也会获得不同的编号。例如,如果有两个排名为 1 的值,下一个值将会被标记为 3‌

2、示例

对student表中的score列使用ROW_NUMBER()进行排序,排序语句如下;

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  ROW_NUMBER() OVER(ORDER BY s.score desc) as higher_score
FROM student s;

执行结果如下所示:

注意:他一般不能用于排名问题,因为对于相同的分数,排名是不同的。

二、RANK()

1、概念

RANK() 为结果集中的每一行分配一个整数,表示其在排序中的相对位置。‌ 如果存在相同的值,RANK() 会将这些值分配相同的排名,并且下一个排名会跳过相应的数量。例如,如果有两个排名为 1 的值,下一个值将会被标记为 3‌。

2、示例

对student表中的score列使用 RANK() 进行排序,排序语句如下;

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  RANK() OVER(ORDER BY s.score desc) as rank_no
FROM student s;

执行结果如下所示:

三、DENSE_RANK()

1、概念

DENSE_RANK() 与 RANK() 类似,也为相同的值分配相同的排名,但它不会跳过数字。‌ 因此,DENSE_RANK() 的排名是连续的,而 RANK() 的排名是不连续的‌。

2、示例

对student表中的score列使用 DENSE_RANK() 进行排序,排序语句如下;

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  DENSE_RANK() OVER(ORDER BY s.score desc) as dense_rank_no
FROM student s;

执行结果如下所示:

四、NTILE()

1、概念

NTILE()函数是一种窗口函数,用于将每个窗口分区的行分割为从1到至多n的n个桶。

2、原理

ntile函数可以将有序的数据集合平均分配到指定的桶中。如果不能平均分配,较小的桶会分配额外的行,并且各个桶中能放的行数最多相差1。例如,如果桶的数量为4,总共有6行数据,分配结果如下:

桶1:1行、2行

桶2:3行、4行

桶3:5行

桶4:6行

这样确保了每个桶中的数据量尽可能均衡。

3、示例

(1)代码1:

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  NTILE(1) OVER(ORDER BY s.score desc) as ntile_no
FROM student s;

(2)代码1运行结果:

(3)代码2:

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  NTILE(2) OVER(ORDER BY s.score desc) as ntile_no
FROM student s;

(4)代码2运行结果:

(5)代码3:

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  NTILE(3) OVER(ORDER BY s.score desc) as ntile_no
FROM student s;

(6)代码 3运行结果:

(7)代码 4:

bash 复制代码
SELECT 
  s.id,
  s.uname,
  s.age,
  s.score,
  NTILE(4) OVER(ORDER BY s.score desc) as ntile_no
FROM student s;

(8)代码 4运行结果:

相关推荐
YHHLAI19 小时前
SQL 完全指南:从入门到精通
数据库·sql
CDN36020 小时前
爬虫把价格库扒光、SQL注入打穿数据库?360CDN WAF规则引擎深度定制,把防护精度拉到逐字段级
数据库·爬虫·sql
天涯柳絮1 天前
SQL注入
数据库·sql·网络安全
计算机源码社1 天前
分享一个基于大数据的跨平台内容生态画像与互动等级分析系统,基于Hadoop+Spark的社交媒体互动数据可视化大屏分析
大数据·hadoop·python·机器学习·数据挖掘·spark·毕业设计
BYSJMG1 天前
计算机毕设选题做什么好?基于大数据的用户健身行为数据分析与可视化系统,Hadoop+Spark处理
大数据·人工智能·hadoop·数据分析·spark·课程设计
ha_lydms2 天前
HDFS 简介
大数据·hadoop·hdfs·yarn·调度·aliyun·计算
Ysx2 天前
把 SQL 从 2700 次降到 4 次:一个 Java 后端对存量报表的 N+1 手术
sql
2601_962298092 天前
零基础学大数据分析全栈
hadoop·python·spark·实战·大数据分析
2301_800074212 天前
mysql DQL
数据库·sql·mysql
Sagittarius_A*2 天前
【好靶场】SQL注入-时间盲注
数据库·sql