这道题目要求我们找出每个部门中薪水最高的员工,并返回这些员工的部门编号、员工编号以及薪水我们要做的事情如下:

1. 确定总体问题

我们需要从员工部门表和薪水表中提取数据,通过员工编号进行连接,并使用窗口函数来确定每个部门中薪水最高的员工。

2. 分析关键问题

  • 连接表:将dept_empsalaries表连接起来,以便获取每个员工的薪水信息。
  • 使用窗口函数进行排名:对每个部门的员工按薪水进行降序排名。
  • 筛选薪水最高的员工:找出每个部门中薪水排名第一的员工。
  • 排序输出:按部门编号升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:连接表

我们使用JOINdept_empsalaries表连接起来:

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;