[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)
posted @ 2020-04-15 16:29  whiky  阅读(125)  评论(0编辑  收藏  举报