这道题目要求我们对员工按入职时间进行降序排名,找出排名倒数第三的员工,并返回这些员工的所有信息,我们要做的事情如下:
1. 确定总体问题
我们需要从员工表中查找出入职时间倒数第三的员工,并返回这些员工的所有信息。由于可能存在同一个日期入职的多个员工,我们需要使用窗口函数来处理排名。
2. 分析关键问题
- 使用窗口函数进行排名:对员工按入职时间进行降序排名。
- 筛选排名倒数第三的员工:找出排名为3的员工。
- 排序输出:按员工编号升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:使用窗口函数进行排名
我们使用DENSE_RANK
窗口函数对员工按入职时间进行降序排名:
select
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date,
dense_rank() over(order by hire_date desc) as rk
from
employees
DENSE_RANK() OVER (ORDER BY hire_date DESC) AS rk
:对员工按入职时间降序排名,DENSE_RANK
会为相同入职时间的员工分配相同的排名。(DENSE_RANK
同等级会用重复的序号,而RANK
会跳过序号,WOE_NUMBER
会分配不同的序号)。- 倒数第三即反向排序正数第三,反向排序后选择第三即可,
步骤2:筛选排名倒数第三的员工
我们在外层查询中筛选出排名为3的员工:
where
rk = 3
WHERE rk = 3
:筛选出排名倒数第三的员工。
步骤3:排序输出
我们使用ORDER BY
按员工编号升序排列输出结果:
order by
emp_no asc
ORDER BY emp_no ASC
:按员工编号升序排列。
完整代码
select
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date
from(
select
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date,
dense_rank() over(order by hire_date desc) as rk
from
employees
) e
where
rk = 3
order by
emp_no asc;