对比rank, dense_rank, row_number

1、一道题惹得祸

letcode——185. 部门工资前三高的所有员工,经典TOPN问题!

2、对比 rank, dense_rank, row_number

【题目】
“成绩表”记录了学生的学号,学生选修的课程,以及对应课程的成绩。

为了对学生成绩进行考核,现需要查询每门课程的前3高成绩。
注意:如果出现并列第一的情况,则同为第一名。

在这里插入图片描述

【解题思路】
题目要求找出每个课程获得前三高成绩的所有学生。难点在于每个课程前3高成绩。
前3高的成绩意味着要对成绩排名。

专用窗口函数rank, dense_rank, row_number有什么区别呢?

它们的区别我举个例子,你们一下就能看懂:

select *,
   rank() over (order by 成绩 desc) as ranking,
   dense_rank() over (order by 成绩 desc) as dese_rank,
   row_number() over (order by 成绩 desc) as row_num
from 班级;

​得到结果:
在这里插入图片描述
从上面的结果可以看出:

  1. rank函数:这个例子中是5位,5位,5位,8位,也就是如果有并列名次的行,会占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,4。

  2. dense_rank函数:这个例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是现在前3名是并列的名次,结果是:1,1,1,2。

  3. row_number函数:这个例子中是5位,6位,7位,8位,也就是不考虑并列名次的情况。比如前3名是并列的名次,排名是正常的1,2,3,4。
    这三个函数的区别如下:
    在这里插入图片描述
    题目要求“如果出现并列第一的情况,则同为第一名”。所以,我们使用窗口函数dense_rank。

步骤一:按课程分组(partiotion by 课程号),并按成绩降序排列(order by 成绩 desc),套入窗口函数的语法,就是下面的sql语句:

select *,
     dense_rank() over(partition by 课程号
                       order by 成绩 desc) as排名
from 成绩表;

运行结果如下:
在这里插入图片描述
步骤二:筛选出前3高的成绩,所以我们在上一步基础上加入一个where字句来筛选出符合条件的数据。(where 排名 <=3)

代码块select 课程号,学号,成绩,排名 from
(select *,
     dense_rank() over (partition by 课程号
                  order by 成绩 desc) as 排名
from 成绩表) as aa
where 排名 <=3;

3、总结

1)对比rank, dense_rank, row_number

rank:相同分数,并列排名,按人数后补
dense_rank,:相同分数,并列排名,按排名后补
row_number:相同分数,不并列排名

在这里插入图片描述
2)窗口函数使用模板

# topN问题 sql模板
select *
from (
   select *, 
          row_number() over (partition by 要分组的列名
                       order by 要排序的列名 desc) as 排名
   from 表名) as a
where 排名 <= N;

参考资料

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值