力扣185(MySQL)-部门工资前三高的所有员工(困难)
题目:
表: Employee
表: Department
公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。
编写一个SQL查询,找出每个部门中 收入高的员工 。
以 任意顺序 返回结果表。
查询结果格式如下所示
输出:
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/department-top-three-salaries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
方法一:窗口函数dense_rank()、内连接join、between...and
①先将employee表按部门号进行分组,按salary进行降序排序。
1 SELECT name, salary, departmentId, dense_rank ( ) over ( PARTITION BY departmentId ORDER BY salary DESC ) AS rnk 2 FROM employee
②再将第一步查询出来的临时表与depatment表通过部门id联结起来,然后筛选出排序数字在1-3的行数据。
1 SELECT 2 b.name as department, 3 a.name as employee, 4 salary 5 FROM 6 ( SELECT name, salary, departmentId, dense_rank ( )over ( PARTITION BY departmentId ORDER BY salary DESC ) AS rnk 7 FROM employee ) as a 8 JOIN department b 9 ON a.departmentId = b.id 10 WHERE a.rnk between 1 AND 3;
#between and可以替换成 a.rnk <= 3
方法二:先找出前三大的薪水,从e2表里寻找在相同部门中比自身e1表更高的工资值,只需要找比当前工资大0,1,2个的,这样自己排第三就刚好第三高薪资。然后把表 Department 和表 Employee 连接,获得各个部门工资前三高的员工
1 SELECT 2 department.name AS department, 3 e1.name AS employee, 4 e1.salary AS salary 5 FROM 6 employee e1,department 7 WHERE 8 e1.departmentId = department.id 9 AND ( 10 SELECT count( DISTINCT e2.salary ) 11 FROM employee e2 12 WHERE e1.salary < e2.salary 13 AND e1.departmentId = e2.departmentId 14 ) < 3 15 ORDER BY 16 department.name, 17 e1.salary DESC;
小知识:
①窗口函数:dense_rank() over(partition by 分组字段 order by 排序字段):排序序号连续:1,2,2,3...
标签:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)