• [SQL]返回最大值的两道题:1076(返回的最大值所在列需要自己创造)+1077(另一张表中的分组返回最大值)


    1076. 项目员工II

    这道题思路并不复杂。有用的表只有Project。一言以蔽之,数每个project_id出现多少次,返回最大的那个值就好。

    问题就是,咱们没有办法直接去找出现次数最多的id,因为它的结果没有直接出现在Project表里。

    想到临时表,就弄个表t,

    接下来的工作就是返回t中num最大值对应的id。然后一步一坑的我又发现,由于原来的Project表中没有对应的num列,如果用COUNT(),还得GROUP BY一下,但先WHERE筛选再GROUP BY的话,按照执行顺序这不智能的尿性,势必会报错。

    主要矛盾就是WHERE和GROUP BY的执行顺序。那有没有办法先GROUP BY形成分组,再筛选呢?

    于是自然想到可以先分组后过滤的小天使HAVING,拯救我于水深火热。

    emmmm....

    所以这道题就变成SELECT...FROM...GROUP BY(按照id分组)...HAVING COUNT(id) = (临时表t中的num的最大值)

    完美

    SELECT project_id
    FROM Project
    GROUP BY project_id
    HAVING COUNT(project_id) = (SELECT MAX(num)
                               FROM (SELECT project_id, COUNT(project_id) AS num FROM Project GROUP BY project_id)t);
    

    1077. 项目员工 III

    和上一题不同的是,由于这里的最大值是分组返回的,并且可能存在并列第一的情况。

    所以,既然分组,那么子查询建立的临时表中,就一定要有GROUP BY;而要返回多个值的话,那么要返回的表中,就一定不能有GROUP BY。

    最后要注意的是,不能只查询experience_years,因为可能会由于项目2中某个人的经验=项目三中经验的最大值而被一起返回,所以子查询的experience_years要配合project_id一起食用。就是(project_id, experience_years) IN (...)的意思。

          SELECT p.project_id, p.employee_id
          FROM Project p LEFT JOIN Employee e
          ON p.employee_id = e.employee_id
          WHERE (project_id, experience_years) IN (SELECT project_id, MAX(experience_years)
                                                    FROM Project p LEFT JOIN Employee e
                                                    ON p.employee_id = e.employee_id
                                                    GROUP BY project_id)
    
  • 相关阅读:
    Springboot 2响应式编程 WebFlux 初体验
    MyBatis集成到Spring
    Java 常用的转换、排序
    Springboot 2使用外部Tomcat源码分析
    Springboot 2启动内置Tomcat源码分析
    Springboot 2启动源码流程
    Springboot 2使用SpringApplication
    IDEA效率插件JRebel的使用
    Spring 源码总结
    Spring事件监听器源码
  • 原文地址:https://www.cnblogs.com/wyz-2020/p/12706221.html
Copyright © 2020-2023  润新知