zoukankan      html  css  js  c++  java
  • [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)
    
  • 相关阅读:
    软件创意——汽车语音安全系统
    对系统管理岗位的理解。
    求二维数组最大子数组的和。郭林林&胡潇丹
    电梯调度 结对项目开发(郭林林&胡潇丹)
    电梯调度 结对项目开发
    电梯调度 结对项目开发
    电梯调度的设计与实现过程(李帅 张硕)
    敏捷软件方法综述
    二维数组的子数组和最大问题(李帅 张硕)
    求数组子数组和的最大值 (线性算法)
  • 原文地址:https://www.cnblogs.com/wyz-2020/p/12706221.html
Copyright © 2011-2022 走看看