LeetCode 184. 部门工资最高的员工
题目描述


题意分析
返回每个部门工资最高的全部员工,包含并列者。结果一行对应一名员工,而不是一个部门。
解法:SQL 查询建模
核心思路
[!blue]
MAX(salary)能求出最高工资,却不能同时确定对应的员工姓名。因此先按departmentId分组,生成临时结果m:每个有员工的部门只有一行,记录它的编号与max_salary。按部门编号分组也能避免把同名部门混在一起。再把
m连回员工表,同时要求部门编号相等、员工工资等于max_salary。前者确保比较的是本部门的最高工资,后者筛出达到最高值的员工;这两个条件缺一不可。每名员工最多匹配本部门的一条聚合记录,不会因这次连接被额外复制。多名并列最高员工会各自匹配同一条聚合记录,因此全部保留。最后通过
e.departmentId = d.id取得部门名称,输出部门、员工和工资。没有员工的部门没有候选记录,不输出占位行;也不要对员工结果额外去重,以免合并同名同薪的不同员工。
解题步骤
- 按部门计算最大工资。
- 用部门与工资双条件匹配员工。
- 连接部门表,输出部门名、员工名和工资。
代码实现
SELECT
d.name AS Department,
e.name AS Employee,
e.salary AS Salary
FROM Employee e
JOIN Department d ON d.id = e.departmentId
-- 先在部门粒度算出每个部门的最高工资,再按「部门 + 工资」双条件连回员工明细,
-- 连接是一对多,因此同部门的多名并列最高者会被全部保留。
JOIN (
-- 每个有员工的部门至多产生一条最高工资记录
SELECT departmentId, MAX(salary) AS max_salary
FROM Employee
GROUP BY departmentId
) m ON m.departmentId = e.departmentId AND m.max_salary = e.salary;
复杂度分析
设员工数为
N,部门数为D。
- 时间复杂度:合适的哈希聚合与连接计划可按 $O(N+D)$ 处理,排序或索引探查可能增加成本,具体以执行计划为准。
- 空间复杂度:哈希计划通常需要部门聚合和连接辅助结构,最坏上界可按 $O(N+D)$ 描述,输出另计。
关键点总结
[!green]
- 聚合找极值,连接恢复对应明细,两个粒度不能混在一次任意取名中。
- 不同员工即使同名同薪,也仍是不同结果行。
易错点总结
[!yellow]
- 只连部门会保留该部门所有人,只连工资会跨部门误配。
- 按部门分组却直接选择非分组姓名,无法保证姓名属于最大工资员工。
- 额外去重可能合并本应保留的不同员工。
相似题目
| 题目 | 难度 | 关联与区别 |
|---|---|---|
| 185. 部门工资前三高的所有员工 | 困难 | 本题每部门取最高工资及全部并列员工,原题扩展为前三种不同工资。 |
| 178. 分数排名 | 中等 | 同样需保留并列,排名或分组最大值不能只挑某一条任意员工记录。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!