Чтобы получить строку с N-м наибольшим значением из столбца, самый надёжный подход — использовать оконную функцию DENSE_RANK().
DENSE_RANK() присваивает согласованный ранг каждой строке на основе её значенияROW_NUMBER(), она корректно обрабатывает дублирующиеся значения, присваивая им одинаковый рангRANK(), она не создаёт пропусков в последовательности ранговОберни логику ранжирования в подзапрос, а затем отфильтруй нужный ранг во внешнем запросе:
SELECT column_name
FROM (
SELECT column_name,
DENSE_RANK() OVER (ORDER BY column_name DESC) AS rnk
FROM table_name
) t
WHERE rnk = N;
ORDER BY column_name DESC сортирует значения от наибольшего к наименьшемуDENSE_RANK() присваивает ранг 1 наибольшему значению, 2 следующему отличному значению и так далееWHERE rnk = N фильтрует результат, возвращая только строку(и) на нужной позицииN на нужный ранг — например, WHERE rnk = 3 вернёт 3-е наибольшее значениеЕсли несколько строк имеют одинаковое значение на позиции N, все совпадающие строки будут возвращены — что делает этот подход более надёжным по сравнению с альтернативами вроде LIMIT/OFFSET или коррелированных подзапросов.
DENSE_RANK() и RANK() дают идентичные результаты при ранжировании значений столбца, поэтому любую из этих функций можно использовать взаимозаменяемо для получения N-го наибольшего значения.
Новый — ещё не проверен сообществом
Вы