Выберите второе по величине минимальное значение в Oracle
Мне нужно написать запрос, который выбирает минимальное значение, и это второе самое минимальное значение из списка чисел.
захват наименьшего значения очевиден:
select min(value) from table;
но второй наименьший не так очевиден.
для записи этот список целых чисел не является последовательным - мин может быть 1000, а второй по величине мин может быть 10000.
3 ответов
используйте аналитическую функцию
SELECT value
FROM (SELECT value,
dense_rank() over (order by value asc) rnk
FROM table)
WHERE rnk = 2
аналитические функции RANK
, DENSE_RANK
и ROW_NUMBER
идентичны, за исключением того, как они обрабатывают связи. RANK
использует спортивный процесс разрыва связей, поэтому, если две строки связывают для ранга 1, следующая строка имеет ранг 3. DENSE_RANK
дает обеим строкам, привязанным к первому месту, ранг 1, а затем присваивает следующей строке ранг 2. ROW_NUMBER
произвольно разрывает галстук и дает одну из двух строк с самым низким значением ранга 1 а другой ранг 2.
select
value
from
(select
value,
dense_rank() over (order by value) rank
from
table)
where
rank = 2
преимущество: вы можете получить третье значение так же легко, или 10 нижних строк (ранг
обратите внимание, что производительность этого запроса выиграет от правильного индекса на "value".