这题考察窗口函数罢了,了解rank()、dense_rank()、row_number()的用法区别就很简单了。

  • rank():排序时若存在相同位次记录,则会跳过之后的位次,简单来说一个示例:1,1,3,4,4,6
  • dense_rank():不跳过。示例:1,1,2,3,3,4
  • row_number():赋予连续唯一的位次。示例:1,2,3,4,5,6

题意很明显,有个关键点是:可能会存在同一个日期入职的员工,所以入职员工时间排名倒数第三的员工可能不止一个。

那么显然,这里该用dense_rank()窗口函数。

select emp_no,birth_date,first_name,last_name,gender,hire_date
from (
      select *,
             dense_rank() over(order by date_format(hire_date,'%Y%m%d') desc) as ranking
      from employees
      ) as t
where ranking=3