Второй по величине оклад

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, второй — пустой результат.