sql solution.sql

Вторая по величине зарплата в SQL

Найдите следующий уровень оклада ниже максимального, а не второго сотрудника в сортировке.

  • ЯзыкSQL
  • УровеньСредний
  • НавыкПодзапросы, DISTINCT и агрегаты

Вторая по величине зарплата

Контекст

В «Пульсе» — внутренней HR-системе компании — начался пересмотр окладов. Финансы просят точку опоры: какая в компании вторая по величине зарплата. Вопрос кажется простым ровно до момента, когда выясняется, что верхний оклад получают двое.

Задача

Верните вторую по величине зарплату среди действующих сотрудников — одно число в колонке second_salary.

Данные

Таблица employees — сотрудники:

колонкатипчто хранит
idintномер сотрудника
nametextимя
department_idintномер отдела
manager_idintномер руководителя, NULL у директора
job_titletextдолжность
salaryintоклад в рублях, NULL если ещё не назначен
hired_atdateдата найма
left_atdateдата ухода, NULL у действующих

Примерные строки:

idnamejob_titlesalaryhired_atleft_at
1Артём Кузнецовдиректор4800002023-02-01NULL
2Марина Лебедеваруководитель разработки4800002023-04-10NULL
22Слава ДёминстажёрNULL2026-06-15NULL
23Кирилл Кимархитектор4900002023-06-012026-05-31

Правила

  1. Ровно одна строка и одна колонка — second_salary.
  2. Считаем только действующих: left_at IS NULL.
  3. «Вторая по величине» — следующий по величине уровень оклада, а не второй сотрудник в отсортированном списке. Если максимум получают двое, оба остаются на первом уровне.
  4. Сотрудники без оклада (salary IS NULL) в расчёт не идут.
  5. Если второго уровня нет — все получают поровну или действующий сотрудник один — верните NULL (особое значение «данных нет»: не ноль и не пустая строка).

Примеры

-- Оклады 500000, 500000, 300000:
-- second_salary
-- 300000

-- Оклады 400000, 400000:
-- second_salary
-- NULL

Где это пригодится

Вопрос про вторую по величине — входной фильтр на собеседовании: он проверяет, различает ли кандидат номер строки и уровень значения. Тот же приём достаёт вторую по обороту площадку и предпоследнюю ступень тарифной сетки.

Двигайтесь по одному шагу

Подсказка 1

Сравнивайте уровни зарплаты, а не позиции сотрудников.

Подсказка 2

Исключите уволенных сотрудников и NULL-оклады до расчёта.

Подсказка 3

Запрос должен вернуть одну строку с NULL, когда второго уровня нет.

Как искать второй уровень, а не вторую строку

Сначала ограничьте набор действующими сотрудниками с окладом, затем ищите максимум среди значений ниже общего максимума.

Не оставляйте задачу изолированной