40. Найти второй по величине оклад
Условие задачи:
Дана таблица Employee(id, email, salary).
Необходимо получить второй по величине уникальный оклад сотрудника.
Если максимальный оклад встречается у нескольких сотрудников, он всё равно считается одним значением.
Спойлеры к решению
Подсказки
💡 Можно найти максимальный оклад, который меньше максимального оклада в таблице.
💡 Другой вариант — использовать
💡 Повторяющиеся значения зарплаты должны иметь одинаковый ранг.
💡 Значения
💡 Другой вариант — использовать
DENSE_RANK() по убыванию зарплаты.💡 Повторяющиеся значения зарплаты должны иметь одинаковый ранг.
💡 Значения
NULL лучше исключить из поиска.Решение
Вариант через подзапрос:
SELECT MAX(salary) AS second_highest_salary
FROM Employee
WHERE salary < (
SELECT MAX(salary)
FROM Employee
);
Сначала определяется максимальный оклад, затем выбирается максимальное значение среди всех окладов, которые меньше него.
Вариант через DENSE_RANK():
SELECT salary AS second_highest_salary
FROM (
SELECT
salary,
DENSE_RANK() OVER (
ORDER BY salary DESC
) AS salary_rank
FROM (
SELECT DISTINCT salary
FROM Employee
WHERE salary IS NOT NULL
) salaries
) ranked
WHERE salary_rank = 2;
DENSE_RANK() присваивает одинаковым зарплатам один и тот же ранг без пропусков:
100000 → 1
100000 → 1
90000 → 2
80000 → 3
Если второго уникального оклада нет, оба варианта вернут отсутствие значения: первый — NULL, второй — пустой результат.