Вторая по величине зарплата — без LIMIT и OFFSET
Классика SQL-собеса: найти вторую по величине зарплату в таблице сотрудников. Проверяют не знание синтаксиса, а понимание, как разные подходы ведут себя на дублях и пустых данных.
Первый способ — вложенный подзапрос без сортировки и лимитов:
SELECT MAX(salary) AS second_salary FROM employee WHERE salary < (SELECT MAX(salary) FROM employee);
Внутренний подзапрос находит максимум, внешний — максимум среди всех, кто меньше него. Если максимальная зарплата встречается у нескольких сотрудников, это не ломает логику: они все отфильтруются условием < и останется корректный второй максимум.
Второй способ — через оконную функцию DENSE_RANK:
SELECT salary AS second_salary FROM ( SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk FROM employee ) ranked WHERE rnk = 2;
DENSE_RANK не пропускает ранги при дублях — в отличие от RANK. Если три человека делят первое место, следующий ранг будет 2, а не 4. Это и есть разница, которую проверяют следующим вопросом.
Спросят: а что если второй зарплаты вообще не существует (все сотрудники получают одинаково)? Первый запрос тихо вернёт NULL — это надо явно предусмотреть в приложении. Второй запрос просто не вернёт строк. Ещё спросят про ORDER BY + LIMIT 1 OFFSET 1 — рабочий, но самый хрупкий вариант: ломается при дублях на границе и плохо читается при расширении до N-й зарплаты.
Задача простая на вид, но именно на ней видно, продумывает кандидат граничные случаи или пишет первое, что сработало на тестовых данных.
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки