这道题目要求我们对员工按入职时间进行降序排名,找出排名倒数第三的员工,并返回这些员工的所有信息,我们要做的事情如下:

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;