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