在Oracle中选择第二个最小值

rye*_*3ad 7 sql oracle oracle11g greatest-n-per-group

我需要编写一个查询来选择一个最小值,它是整数列表中第二个最小值.

抓住最小的值是显而易见的:

select min(value) from table;
Run Code Online (Sandbox Code Playgroud)

但第二小的并不那么明显.

对于记录,此整数列表不是连续的 - 最小值可以是1000,第二个最小值可以是10000.

Jus*_*ave 15

使用分析函数

SELECT value
  FROM (SELECT value,
               dense_rank() over (order by value asc) rnk
          FROM table)
 WHERE rnk = 2
Run Code Online (Sandbox Code Playgroud)

该分析功能RANK,DENSE_RANK以及ROW_NUMBER是除了他们如何处理关系相同. RANK使用一种打破关系的运动风格的过程,所以如果两行排列等级为1,则下一行的等级为3. DENSE_RANK给出第一个排名为1的行,然后将下一行排为等级2. ROW_NUMBER任意打破平局并给出两行中的一行,其中最低值的等级为1,另一行的等级为2.


Gol*_*rol 7

select 
  value
from
  (select 
    value, 
    dense_rank() over (order by value) rank
  from 
    table)
where
  rank = 2
Run Code Online (Sandbox Code Playgroud)

优点:您可以轻松获得第三个值,或者最后10行(等级<= 10).

请注意,此查询的性能将受益于"值"的正确索引.


JNK*_*JNK 6

SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)
Run Code Online (Sandbox Code Playgroud)