订阅更新

项目员工二:员工最多的项目(含并列)

SQL 实战 123 题 · 第 53 题 简单 约 2 分钟读完

LeetCode 1076 · 分组计数、并列最大值

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

分组计数后,要么 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 只返回一个项目,并列时结果不完整。
刷题进度保存在当前浏览器