SQL LeetCode: 184. Department Highest Salary
184. Department Highest Salary
Medium
SQL Schema
The Employee
the table holds all employees. Every employee has an Id, a salary, and there is also a column for the department Id.
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 70000 | 1 |
| 2 | Jim | 90000 | 1 |
| 3 | Henry | 80000 | 2 |
| 4 | Sam | 60000 | 2 |
| 5 | Max | 90000 | 1 |
+----+-------+--------+--------------+
The Department
table holds all departments of the company.
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
Write a SQL query to find employees who have the highest salary in each of the departments. For the above tables, your SQL query should return the following rows (order of rows does not matter).
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
+------------+----------+--------+
Explanation:
Max and Jim both have the highest salary in the IT department and Henry has the highest salary in the Sales department.
- Using dense_rank window function
WITH CTE AS (
SELECT
d.Name as Department,
e.Name as Employee,
e.Salary as Salary,
dense_rank() OVER (partition by e.DepartmentId Order by Salary desc) as dr_salary
FROM
Employee e
LEFT JOIN Department d
ON e.DepartmentId = d.Id )
SELECT
Department, Employee, Salary
FROM
CTE
WHERE dr_salary = 1
and Department is not null
2. Using Group By
WITH CTE AS (
SELECT
max(Salary) as Salary, DepartmentId
FROM
Employee
group by DepartmentId )
SELECT d.Name as Department, e.Name as Employee, c.Salary
FROM
Employee e
JOIN CTE c
ON e.DepartmentId = c.DepartmentId
and c.Salary = e.Salary
JOIN Department d
ON d.Id = e.departmentId