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