DENSE_RANK 窗口函数

DENSE_RANK函数用于在SQL中实现分组的并列排名,尤其在处理薪资或成绩等排名场景时。它基于OVER子句中的ORDERBY排序,若使用PARTITIONBY,则按分组重置排名。例如,在员工表中,可以按部门分组并按薪水降序排列,得到每个部门薪资的前几名。示例查询展示了如何使用此函数来获取每个部门的前三高薪资员工。
摘要由CSDN通过智能技术生成

这个函数能干什么呢?先做个题练练手吧(参考sql在文末)力扣https://leetcode.cn/problems/department-top-three-salaries/

函数作用:

DENSE_RANK 窗口函数基于 OVER 子句中的 ORDER BY 表达式确定一组值中的一个值的排名。如果存在可选的 PARTITION BY 子句,则为每个行组重置排名

说人话:实现了分组的并列排名

函数语法:

 DENSE_RANK () OVER
(

#按照什么进行分组 比如按照部门、班级等
[ PARTITION BY expr_list ]

#按照什么进行排名 比如工资、成绩等
[ ORDER BY order_list ]

函数参数:

( )

该函数没有参数,但需要空括号。

OVER

适用于 DENSE_RANK 函数的窗口子句。

PARTITION BY expr_list

可选。一个或多个定义窗口的表达式。

ORDER BY order_list

可选。排名值基于的表达式。如果未指定 PARTITION BY,则 ORDER BY 使用整个表。如果省略 ORDER BY,则所有行的返回值为 1。

函数返回值:即order字段在partition分组内的排名, 

函数返回值的规律:order字段的值相同则排名相同;排名每次加一或者减一

 举例:

输入: 
Employee 表:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 85000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
| 7  | Will  | 70000  | 1            |
+----+-------+--------+--------------+

sql:
select * ,dense_rank()over(partition by departmentId order by salary desc) as rk 
from employee as t1

输出结果:
+----+-------+--------+--------------+----+
| id | name  | salary | departmentId | rk |
+----+-------+--------+--------------+----+
| 4  | Max   | 90000  | 1            | 1  |
| 7  | Joe   | 85000  | 1            | 2  |
| 6  | Randy | 85000  | 1            | 2  |
| 1  | Will  | 70000  | 1            | 3  |
| 5  | Janet | 69000  | 1            | 4  |
| 2  | Henry | 80000  | 2            | 1  |
| 3  | San   | 60000  | 2            | 2  |
+----+-------+--------+--------------+----+
department 字段按照部门进行了分类
同一个部门的 salary 依次递减
rk 表示 salary 在部门中的并列排名

        通过以上代码的演示,我们就拿到了分部门(department)的薪水(salary)排名,我们只需要选出薪水排名(rk)小于等于3的并且和department表连接查询就可以完成上题了。

参考sql:

select t3.name as Department,t2.name as Employee,t2.salary as Salary
from (
    select * ,dense_rank()over(partition by departmentId order by salary desc) as rk 
    from employee as t1
) t2
left join Department as t3
on t3.id = t2.departmentId
where t2.rk <= 3;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值