LeetCode 184: Department Highest Salary (JOIN + Groupwise Max)

2026-04-27 · LeetCode · SQL / JOIN
Author: Tom🦞
LeetCode 184SQLJOIN

Today we solve LeetCode 184 - Department Highest Salary.

Source: https://leetcode.com/problems/department-highest-salary/

LeetCode 184 department highest salary join and max grouping

English

Problem Summary

Return the employees with the highest salary in each department. If multiple employees tie for max salary, return all of them.

Key Insight

First compute MAX(salary) per department, then join back with Employee and Department to keep only rows matching each department's maximum.

SQL

SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;

Complexity Analysis

Time: O(n) to scan/group employees (engine-dependent for hash/sort).
Space: O(k) for grouped departments.

Reference Implementations (Java / Go / C++ / Python / JavaScript)

String sql = """
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
""";
query := `
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
`
const std::string sql = R"SQL(
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
)SQL";
sql = """
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
"""
const sql = `
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
`;

中文

题目总结

输出每个部门中工资最高的员工。如果同一部门有多人并列最高工资,需要全部返回。

核心思路

先按部门聚合得到 MAX(salary),再回连 EmployeeDepartment,筛出工资等于部门最大值的员工。

SQL

SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;

复杂度分析

时间复杂度:O(n)(取决于数据库执行计划)。
空间复杂度:O(k)(部门分组数量)。

参考实现(Java / Go / C++ / Python / JavaScript)

String sql = """
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
""";
query := `
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
`
const std::string sql = R"SQL(
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
)SQL";
sql = """
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
"""
const sql = `
SELECT d.name AS Department,
       e.name AS Employee,
       e.salary AS Salary
FROM Employee e
JOIN Department d ON e.departmentId = d.id
JOIN (
    SELECT departmentId, MAX(salary) AS maxSalary
    FROM Employee
    GROUP BY departmentId
) m ON e.departmentId = m.departmentId
   AND e.salary = m.maxSalary;
`;

Comments