这道题目要求我们找出每个部门中薪水最高的员工,并返回这些员工的部门编号、员工编号以及薪水我们要做的事情如下:
1. 确定总体问题
我们需要从员工部门表和薪水表中提取数据,通过员工编号进行连接,并使用窗口函数来确定每个部门中薪水最高的员工。
2. 分析关键问题
- 连接表:将
dept_emp
和salaries
表连接起来,以便获取每个员工的薪水信息。 - 使用窗口函数进行排名:对每个部门的员工按薪水进行降序排名。
- 筛选薪水最高的员工:找出每个部门中薪水排名第一的员工。
- 排序输出:按部门编号升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:连接表
我们使用JOIN
将dept_emp
和salaries
表连接起来:
from
dept_emp d
join salaries s on s.emp_no = d.emp_no
JOIN salaries s ON s.emp_no = d.emp_no
:通过员工编号连接两个表,以便获取每个员工的薪水信息。
步骤2:使用窗口函数进行排名
我们使用DENSE_RANK
窗口函数对每个部门的员工按薪水进行降序排名:
select
d.dept_no,
d.emp_no,
salary,
dense_rank() over(partition by dept_no order by salary desc) as rk
DENSE_RANK() OVER (PARTITION BY dept_no ORDER BY salary DESC) AS rk
:对每个部门的员工按薪水进行降序排名,考虑到可能出现并列第一的情况,使用DENSE_RANK
会为相同薪水的员工分配相同的排名。
步骤3:筛选薪水最高的员工
我们在外层查询中筛选出每个部门中薪水排名第一的员工:
where rk = 1
WHERE rk = 1
:筛选出每个部门中薪水排名第一的员工。
步骤4:排序输出
我们使用ORDER BY
按部门编号升序排列输出结果:
order by dept_no asc
ORDER BY dept_no ASC
:按部门编号升序排列。
完整代码
select
dept_no,
emp_no,
salary
from(
select
d.dept_no,
d.emp_no,
salary,
dense_rank() over(partition by dept_no order by salary desc) as rk
from
dept_emp d
join salaries s on s.emp_no = d.emp_no
) a
where rk = 1
order by dept_no asc;