项目员工三:每个项目里经验最丰富的人(含并列)
LeetCode 1077 · 分组 Top 1、RANK 并列
面试怎么回答
Project JOIN Employee 后,RANK() OVER (PARTITION BY project_id ORDER BY experience_years DESC) 取 rk = 1。这是分组取最大值的标准写法,并列的人都会保留。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
项目表记录项目和参与员工,员工表有工作年限。找出每个项目里工作年限最长的员工;年限并列最长的都要列出。
表结构
- Project:project_id、employee_id;(project_id, employee_id) 为主键
- Employee:employee_id(主键)、name、experience_years
思路
关联拿到年限后,按项目分区、年限降序用 RANK 排名,取排名为 1 的员工。并列最长都要,所以用 RANK 或 DENSE_RANK,不用 ROW_NUMBER。
参考解法
select project_id ,employee_id
from(
select project_id,e.employee_id,
rank()over(partition by project_id order by experience_years desc) rk
from Project p join Employee e
on p.employee_id=e.employee_id
)t1
where rk=1
易错点
- ROW_NUMBER 在并列时只留一个人。