【发布时间】:2012-01-01 13:14:32
【问题描述】:
我需要编写一个查询,从整数列表中选择一个最小值并且它是第二个最小值。
取最小值很明显:
select min(value) from table;
但是第二小的就不那么明显了。
为了记录,这个整数列表不是连续的——最小值可以是 1000,第二大的最小值可以是 10000。
【问题讨论】:
标签: sql oracle oracle11g greatest-n-per-group
我需要编写一个查询,从整数列表中选择一个最小值并且它是第二个最小值。
取最小值很明显:
select min(value) from table;
但是第二小的就不那么明显了。
为了记录,这个整数列表不是连续的——最小值可以是 1000,第二大的最小值可以是 10000。
【问题讨论】:
标签: sql oracle oracle11g greatest-n-per-group
使用分析函数
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)
【讨论】: