美文网首页
SQL1-查找最晚入职员工的所有信息

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

作者: 何几时 | 来源:发表于2021-03-19 17: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题

    相关文章

      网友评论

          本文标题:SQL1-查找最晚入职员工的所有信息

          本文链接:https://www.haomeiwen.com/subject/fxcbcltx.html