订阅更新

项目员工三:每个项目里经验最丰富的人(含并列)

SQL 实战 123 题 · 第 54 题 中等 约 2 分钟读完

LeetCode 1077 · 分组 Top 1、RANK 并列

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

面试怎么回答

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 在并列时只留一个人。
刷题进度保存在当前浏览器