Найти вторую по величине зарплату, обработав случай её отсутствия
Таблица Employee(id, name, salary). Верните вторую по величине различную зарплату.
Требования:
должен быть определён; форма, возвращающая NULL, предпочтительнее пустого результата
- дубликаты топ-зарплаты не должны сдвигать ответ — ранжируйте по различному значению
- когда второй зарплаты нет (все строки с одним значением или строка одна), результат
SELECT MAX(salary) AS second_highest
FROM Employee
-- ваш запрос здесь
Напишите запрос.
Возьмите MAX(salary) там, где salary < (SELECT MAX(salary) FROM Employee): внутренний максимум — топ-зарплата, поэтому внешний максимум — вторая. Если второй зарплаты нет, эта форма аккуратно возвращает одну строку NULL. Вариант ORDER BY salary DESC LIMIT 1 OFFSET 1 вместо этого не возвращает строк.
- ✗Считать, что
LIMIT 1 OFFSET 1совпадает с подзапросомMAX < MAXпри равных топ-зарплатах - ✗Забывать, что форма
LIMIT/OFFSETне возвращает строк, аMAX(... < MAX)возвращаетNULL - ✗Не убирать дубликаты зарплат, из-за чего равные топ-значения сдвигают результат
- →Как дубликаты топ-зарплаты меняют результат
LIMIT/OFFSETпротив подзапроса? - →Почему форма
MAX(... < MAX)возвращаетNULL, а не пустой результат?
Задача
Найти вторую по величине зарплату в таблице Employee(id, name, salary, dept_id, manager_id).
-- Подзапрос: максимум среди зарплат меньше самой большой
SELECT MAX(salary) AS second_highest
FROM Employee
WHERE salary < (SELECT MAX(salary) FROM Employee);
-- Вариант через LIMIT/OFFSET (иначе ведёт себя при отсутствии второй)
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
Как это работает
Внутренний SELECT MAX(salary) находит самую большую зарплату. Внешний MAX(salary) с условием salary < ... берёт максимум среди оставшихся — это и есть вторая по величине.
Разница в граничном случае (одна уникальная зарплата):
- форма
MAX(... < MAX)вернёт одну строку со значениемNULL; - форма
LIMIT 1 OFFSET 1вернёт ноль строк.
⚠️ DISTINCT важен: без него дубликаты топ-зарплаты сдвинут OFFSET и дадут не ту строку.