Для трёх лучших различных уровней зарплаты используйте DENSE_RANK по отделу и оставьте rank ≤ 3. Тогда все сотрудники с одинаковой зарплатой попадут вместе.
Таблица `employees`:
Для трёх лучших различных уровней зарплаты используйте DENSE_RANK по отделу и оставьте rank ≤ 3. Тогда все сотрудники с одинаковой зарплатой попадут вместе.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Таблица employees:
| id | name | department | salary |
|---|---|---|---|
| 1 | A | IT | 100 |
| 2 | B | IT | 100 |
| 3 | C | IT | 90 |
| 4 | D | IT | 80 |
| 5 | E | HR | 200 |
| 6 | F | HR | 180 |
Нужно вывести всех сотрудников, которые входят в топ-3 по зарплате внутри своего отдела. Если у нескольких сотрудников одинаковая зарплата, они должны попасть все (даже если это расширит топ-3 до 4-5 человек).
Ответ
Для трёх лучших различных уровней зарплаты используйте DENSE_RANK по отделу и оставьте rank ≤ 3. Тогда все сотрудники с одинаковой зарплатой попадут вместе.
WITH ranked AS (
SELECT id, name, department, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS salary_rank
FROM employees
)
SELECT id, name, department, salary
FROM ranked
WHERE salary_rank <= 3
ORDER BY department, salary DESC, id;
При такой трактовке в IT попадут A, B, C и D, в HR — E и F. Если нужны именно три позиции сотрудников с включением совпадений на границе третьей, нужен RANK, и IT тогда даст A, B, C. Этот смысл «топ-3» стоит уточнить до реализации.