SQL1-查找最晚入职员工的所有信息

2021-03-19  本文已影响0人  何几时

这道题有三种解法

image.png

思路一(不推荐):

假定最晚入职员工是只有一个人,可以利用对 hire_date 字段进行降序排序,那么排序第一行数据正是我们所要找的数据,这时候利用 limit 0,1 进行分页(0指的是第一页!1是指一页只显示一条信息)

select *
from employees
order by hire_date desc
limit 0,1;

思路2:

这次我们不再假定只有一个人,而是预估最晚入职的人可能是多个人,所以需要找到 hire_date 的最大值,只要 hire_date 等于最大值,则查询出来对应的所有信息,自己比较自己的最大值立即推子查询

select *
from employees
where `hire_date` = (
  select max(`hire_date`)
  from employees
);

思路3(强推):

这个思路是由力扣的数据库第185题-部门工资前三高的员工的排名题解排名第二启发的,这里需要换一个思维。最晚入职 意思是hire_date 的最大值。此时需要“我”影分身“你”,这里,“我”和“你”都是同一张表的不同别名。那么要找“我”的hire_date 的最大值,也就是说“你”比我大的数量是0(即在我前面的数据是0条)。这里注意要用自己比较自己的最大值立即推子查询,而且要加别名“我”(即e1)和“你”(即e2)。

select *
from employees e1
where 0 = (
  select count(distinct e2.`hire_date`)
  from employees e2
  where e2.`hire_date` > e1.`hire_date`
);

One More Thing

进阶一点的题就是leetcode的第185题

image.png
思路是一样的,e1=e2=employees,找出排名前三的,也就是“你”比“我”大的数据条数小于3,记住不能是小于等于,因为等于的话意味着在“我”前面有三个人,那我不就第四名了。
select d.Name Department,e1.Name Employee,e1.Salary Salary
from Employee e1
join Department d on e1.DepartmentID=d.Id 
where 3 > (
    select count(distinct e2.Salary)
    from Employee e2
    where e2.Salary > e1.Salary and e1.DepartmentID=e2.DepartmentID
);

当然这道题还有更加优雅的方法,利用开窗函数解决,详情请见leetcode数据库第185题

上一篇 下一篇

猜你喜欢

热点阅读