大家好,我是空空star,本篇带大家了解一道稍微复杂的力扣sql练习题。
文章目录
- 前言
- 一、题目:185. 部门工资前三高的所有员工
- 二、解题
- 1.正确示范①
- 提交SQL
- 运行结果
- 2.正确示范②
- 提交SQL
- 运行结果
- 3.其他
- 总结
前言
上一篇带大家练习了部门工资最高的员工,如果大家掌握了的话,本篇这道题就很容易了。
一、题目: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个