题目描述

✅ 184. 部门工资最高的员工

image-20260928231240912

image-20260928231240913

题意分析

返回每个部门工资最高的全部员工,包含并列者。结果一行对应一名员工,而不是一个部门。

解法: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. 分数排名 中等 同样需保留并列,排名或分组最大值不能只挑某一条任意员工记录。
转载与许可
作者
链接 https://hgnulb.github.io/blog/2024/90074598
许可 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!