Собесов

alexeygrigorev/data-science-interviews: вторая по величине зарплата

SQLПодзапросы и оконкиЛёгкаяJunior

Условие

Из таблицы employee(id, salary) найдите вторую по величине уникальную зарплату. Если такой нет (все зарплаты одинаковые или сотрудник один), верните NULL.

Решение

Подход

Тут пять разных типичных решений и каждое имеет нюанс с обработкой случая «второй разной зарплаты нет».

Реализация

-- 1) Подзапрос с MAX < MAX (классика, обрабатывает NULL автоматически)
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);
 
-- 2) LIMIT/OFFSET по DISTINCT
SELECT DISTINCT salary AS second_highest
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
-- Минус: если второй разной нет — пусто, а не NULL.
 
-- 3) DENSE_RANK (универсально для k-й по величине)
SELECT salary AS second_highest
FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
) t
WHERE rnk = 2
LIMIT 1;
 
-- 4) Гарантия NULL вместо пустого результата
SELECT (
    SELECT DISTINCT salary
    FROM employee
    ORDER BY salary DESC
    LIMIT 1 OFFSET 1
) AS second_highest;

Подводные камни

  1. RANK vs DENSE_RANK vs ROW_NUMBER: при одинаковых зарплатах RANK пропустит номера (1, 1, 3 — и второй по величине отсутствует), ROW_NUMBER назначит уникальные номера и вторая зарплата может оказаться той же, что и первая. Нужен именно DENSE_RANK или DISTINCT salary.
  2. «Пусто» vs NULL: вариант с LIMIT/OFFSET возвращает пустой набор, а интервьюер обычно ждёт строку со значением NULL. Оборачивайте в скалярный подзапрос (SELECT (...)).
  3. Дубликаты зарплат. Без DISTINCT или DENSE_RANK вторая «по строке» — это часто первая по величине. Обязательно ищите по уникальным значениям.
  4. N-я по величине. Решение через DENSE_RANK легко обобщается до n-й: WHERE rnk = N.

Эталонный ответ

SELECT MAX(salary) FROM employee WHERE salary < (SELECT MAX(salary) FROM employee) или DENSE_RANK() OVER (ORDER BY salary DESC) = 2. Оба корректно обрабатывают дубликаты и при отсутствии второй зарплаты возвращают NULL.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти