LeetCode 184: Department Highest Salary (JOIN + Groupwise Max)
LeetCode 184SQLJOINToday we solve LeetCode 184 - Department Highest Salary.
Source: https://leetcode.com/problems/department-highest-salary/
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),再回连 Employee 和 Department,筛出工资等于部门最大值的员工。
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