Skip to main content
madhavcodes25
EditReport

Department Top Three Salaries

Description:​

A company's executives are interested in seeing who earns the most money in each of the company's departments. A high earner in a department is an employee who has a salary in the top three unique salaries for that department.

Write a solution to find the employees who are high earners in each of the departments. Return the result table in any order.

Table: Employee

Column NameType
idint
namevarchar
salaryint
departmentIdint

id is the primary key for this table.

Table: Department

Column NameType
idint
namevarchar

id is the primary key for this table.

Example 1: Input: Employee table:

idnamesalarydepartmentId
1Joe850001
2Henry800002
3Sam600002
4Max900001
5Janet690001
6Randy850001
7Will700001

Department table:

idname
1IT
2Sales

Output:

DepartmentEmployeeSalary
ITMax90000
ITJoe85000
ITRandy85000
ITWill70000
SalesHenry80000
SalesSam60000

Explanation: In the IT department: Max earns the highest, Joe and Randy both earn the second-highest, and Will earns the third-highest. In the Sales department: Henry earns the highest and Sam earns the second-highest.


Approaches:​

1. Using Window Function (DENSE_RANK())​

We can use a Common Table Expression (CTE) along with the DENSE_RANK() window function to assign a rank to each employee's salary within their specific department. The DENSE_RANK() function ensures that identical salaries receive the same rank without skipping the next consecutive integer. We then filter out any employee whose rank is greater than 3.

  • Time Complexity: O(Nlog⁑N)O(N \log N) as window functions require sorting the data based on the ORDER BY clause inside the OVER() partition.
  • Space Complexity: O(N)O(N) for the temporary storage required by the CTE to hold the ranked intermediate data.

Window Function Solutions:​

MySQL / PostgreSQL

WITH RankedSalaries AS (
SELECT
departmentId,
name,
salary,
DENSE_RANK() OVER (PARTITION BY departmentId ORDER BY salary DESC) as rnk
FROM
Employee
)
SELECT
d.name AS Department,
rs.name AS Employee,
rs.salary AS Salary
FROM
RankedSalaries rs
JOIN
Department d
ON
rs.departmentId = d.id
WHERE
rs.rnk <= 3;
Finished reading? Mark this topic as complete.