- 部门工资最高的员工
题目:编写SQL查询以查找每个部门中薪资最高的员工。按 任意顺序 返回结果表。
输入:
Employee 表:
±—±------±-------±-------------+
| id | name | salary | departmentId |
±—±------±-------±-------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
±—±------±-------±-------------+
Department 表:
±—±------+
| id | name |
±—±------+
| 1 | IT |
| 2 | Sales |
±—±------+
输出:
±-----------±---------±-------+
| Department | Employee | Salary |
±-----------±---------±-------+
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
| IT | Max | 90000 |
±-----------±---------±-------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
分析:
部门工资最高的员工
1.先求工资最高的员工(由于名字可能会有相同,所以不展示姓名) select e.departmentId,max(e.salary) Salary from Employee e group by e.departmentId
2.和部门进行联结
3.注意:我一开始查找最高员工工资的时候,只显示了工资。联结后只查找了工资在这个条件下的。忽略了是每个部门的最高工资,如果不考虑部门,最高工资不一定是这个部门的最高工资。
4.俩个字段用in
select d.name as Department,e.name as Employee, e.salary as Salary
from Employee e
join Department d
on e.departmentId=d.id
where (e.departmentId,salary) in
(select e.departmentId,max(e.salary) Salary
from Employee e
group by e.departmentId);
考察知识点:
子查询,TopN,窗口函数