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.
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).
请注意,此查询的性能将受益于"值"的正确索引.
SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10727 次 |
| 最近记录: |