Выберите второе по величине минимальное значение в 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".


SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)