Используйте DENSE_RANK по зарплате внутри отдела и оставьте ранги до трёх. Это выбирает три уникальных уровня зарплаты вместе со всеми сотрудниками на них.
185. Три самые высокие зарплаты в департаменте
Используйте DENSE_RANK по зарплате внутри отдела и оставьте ранги до трёх. Это выбирает три уникальных уровня зарплаты вместе со всеми сотрудниками на них.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
- Три самые высокие зарплаты в департаменте
Руководителей компании интересует, кто зарабатывает больше всего денег в каждом из отделов. Высокооплачиваемым сотрудником в отделе считается тот, чья зарплата входит в тройку самых высоких уникальных зарплат в этом отделе.
Напишите решение для определения высокооплачиваемых сотрудников в каждом из отделов.
Возвращает таблицу результатов в любом порядке.
Формат результата представлен в следующем примере.
Ответ
Используйте DENSE_RANK по зарплате внутри отдела и оставьте ранги до трёх. Это выбирает три уникальных уровня зарплаты вместе со всеми сотрудниками на них.
При стандартной схеме Employee(id, name, salary, departmentId) и Department(id, name):
WITH ranked AS (
SELECT name, salary, departmentId,
DENSE_RANK() OVER (
PARTITION BY departmentId ORDER BY salary DESC
) AS salary_rank
FROM Employee
WHERE salary IS NOT NULL
)
SELECT d.name AS Department, r.name AS Employee, r.salary AS Salary
FROM ranked r
JOIN Department d ON d.id = r.departmentId
WHERE r.salary_rank <= 3;
ROW_NUMBER здесь неверен: он ограничит число сотрудников, а не число различных зарплат. В отделе может получиться больше трёх строк.