FETCH FIRST … ROWS WITH TIES
В этой статье я хочу показать новще решение распостраненной задачи. Найти в таблице записи с максимальным значением в одной из колонок.Для примера мы будем искать сотрудников с максимальной зарплатой.
Первое что приходит в голову - это ORDER BY salary DESC LIMIT 1 Логично но не правильно потому что максимальную зарплату мщгут получать несколько сотрудников.
Стандартное решение - сравнить зарплату с результатом подзапроса:
select * from employees where salary = (select max(salary) from employees);
стандартно - не значит эффективно. Если наша СУБД поддерживает оконные функции:
with ranked as ( select employees.*, dense_rank() over (order by salary desc) r from employees ) select * from ranked where r = 1;
немного эффективней, но слишком многословно :(
Есть еще один вариант о котором знают не все. Стандарт SQL:2008 предлагает новое решение данной задачи: FETCH FIRST … ROWS WITH TIES :
select * from employees order by salary desc fetch first 1 rows with ties;
Компактно и элегантно. Проверить эти у другие запросы можно на SQLize.online
