Выберите второе самое минимальное значение в Oracle - PullRequest
7 голосов
/ 18 ноября 2011

Мне нужно написать запрос, который выбирает минимальное значение и его второе самое минимальное значение из списка целых чисел.

Захват наименьшего значения очевиден:

select min(value) from table;

Но второе самое маленькое не так очевидно.

Для записи, этот список целых чисел не является последовательным - минимальное значение может быть 1000, а второе самое большое значение может быть 10000.

Ответы [ 3 ]

15 голосов
/ 18 ноября 2011

Используйте аналитическую функцию

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.

7 голосов
/ 18 ноября 2011
select 
  value
from
  (select 
    value, 
    dense_rank() over (order by value) rank
  from 
    table)
where
  rank = 2

Преимущество: вы можете легко получить третье значение или 10 нижних строк (ранг <= 10). </p>

Обратите внимание, что выполнение этого запроса выиграет от правильного индекса 'value'.

6 голосов
/ 18 ноября 2011
SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)
...