sql—窗口函数rank()、dense_rank()的使用

本文详细介绍了SQL中的窗口函数Rank()和Dense_Rank(),通过实例解析它们在分组排序中的不同用法。Rank()在遇到相同排名时会跳过后续位次,而Dense_Rank()则不会。文章提供了查询各部门工资前三名员工和各科成绩前三名学生的SQL示例,展示了如何结合Partition By和Order By使用这些函数。同时,还分享了两道关于查询成绩高于60分学生的SQL题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗口函数

简单理解就是rank()、dense_rank()用来获取排名,可以用partition by 来分组,order by 对某一字段的数据进行排名。

1、RANK()
在计算排序时,若存在相同位次,会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,4······

2、DENSE_RANK()
这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,2······

语法:

<窗口函数> OVER ( ORDER BY <排序用列清单> )

举例

例1:[LC185]. 部门工资前三高的所有员工
在这里插入图片描述
在这里插入图片描述

思路:
此题要获得各部门的前三高工资的员工,在使用窗口函数时注意用partition by进行分组排序,而不是对整个表进行salary的降序排列。

select b.name department ,a.name Employee ,a.salary
from (select c.* ,
dense_rank() over( partition by departmentid order by salary desc ) as 'num'
from employee c ) a
left join department b
on a.departmentid=b.id
where b.name is not null and a.num<=3;

例2:查询各科成绩前三名的记录

在这里插入图片描述
在这里插入图片描述
思路:
先使用rank() over (partition by CId order by score)获取每门课的学生排名,作为表a,与学生表s查询出每门课前三名学生信息。

select a.CId, s.*, a.score, a.rank
from Student s,
(select sc.*, rank() over (partition by sc.CId order by sc.score desc) as rank
from SC sc) as a
where s.SId = a.SId and a.rank <= 3
order by a.CId;

结果为
在这里插入图片描述
------------------------------------我是分割线-----------------------------------------

另附两道常出的sql题目
在这里插入图片描述
在这里插入图片描述
查出每门课都大于60的学生

SELECT s.* FROM Student s,
(SELECT sc.SId AS SId FROM SC sc
GROUP BY sc.SId
HAVING MIN(sc.score) > 60) a
WHERE s.`SId` = a.SId;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值