[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)