项目员工二:员工最多的项目(含并列)
LeetCode 1076 · 分组计数、并列最大值
面试怎么回答
分组计数后,要么 HAVING COUNT() = (各项目计数的最大值),要么在分组结果上 RANK() OVER (ORDER BY COUNT() DESC) 取 1。两种都能返回并列最多的所有项目,不会像 LIMIT 1 那样漏掉。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
同一张项目表,找出参与员工最多的项目;如果多个项目人数并列最多,全部输出。
表结构
- Project:project_id、employee_id;(project_id, employee_id) 为主键
思路
并列最多都要输出,所以不能 LIMIT 1。两种写法:一是 HAVING 计数等于「最大的那个计数」;二是在分组结果上用 RANK 排名取第一。
参考解法
写法 1:HAVING 比较最大计数
select project_id
from Project
group by project_id
having count(*) =
(select count(*) `num` from Project group by project_id order by count(*) desc limit 1);
写法 2:窗口 RANK 取第一名
select project_id from
(select project_id,rank()over(order by count(employee_id) desc) ranking from Project group by project_id) temp where ranking=1
易错点
- LIMIT 1 只返回一个项目,并列时结果不完整。