力扣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...

 

posted on 2023-03-16 11:22  我不想一直当菜鸟  阅读(637)  评论(0编辑  收藏  举报