zl程序教程

您现在的位置是:首页 >  其它

当前栏目

力扣-部门工资前三高的所有员工

所有 员工 力扣 部门 工资
2023-09-14 09:13:33 时间

大家好,我是空空star,本篇带大家了解一道稍微复杂的力扣sql练习题。


前言

上一篇带大家练习了部门工资最高的员工,如果大家掌握了的话,本篇这道题就很容易了。


一、题目:185. 部门工资前三高的所有员工

表: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
Id是该表的主键列。
departmentId是Department表中ID的外键。
该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。

表: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
Id是该表的主键列。
该表的每一行表示部门ID和部门名。

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。

编写一个SQL查询,找出每个部门中 收入高的员工 。

以 任意顺序 返回结果表。

查询结果格式如下所示。

二、解题

1.正确示范①

提交SQL

select u2.name Department,
u1.name Employee,
u1.salary Salary
from(
    select id,name,
    salary,
    departmentId,
    dense_rank() over(partition by departmentId order by salary desc ) col
    from Employee
) u1
left join Department u2 
on u1.departmentId=u2.id
where col<=3
order by u1.id

运行结果

2.正确示范②

提交SQL

select d.name Department,
u1.name Employee,
u1.salary Salary
from Employee u1
join Department d
on u1.departmentId=d.id
where 3 >
(
    select count(distinct u2.Salary)
    from Employee u2
    where u2.Salary > u1.Salary
    and u1.departmentId=u2.departmentId
)

运行结果

3.其他


总结

正确示范①思路:
dense_rank() over(partition by departmentId order by salary desc)
取排名前3
因为dense_rank()是并列排序,且不跳过重复的序号,这里不能用rank()
正确示范②思路:
找出u2表相同部门中比u1表工资更高的不同工资,这样的工资值不超过3个