四川住房建设和城乡建设厅新网站网站被k怎么查
大家好,我是空空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 ) colfrom 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 u2where u2.Salary > u1.Salaryand u1.departmentId=u2.departmentId
)
 
运行结果
 
3.其他
总结
正确示范①思路:
dense_rank() over(partition by departmentId order by salary desc)
取排名前3
因为dense_rank()是并列排序,且不跳过重复的序号,这里不能用rank()
正确示范②思路:
找出u2表相同部门中比u1表工资更高的不同工资,这样的工资值不超过3个
