我需要编写一个查询来选择一个最小值,并且它是整数列表中的第二个最小值。
抓取最小值是显而易见的:
select min(value) from table;
但是第二小的就不那么明显了。
郑重声明,这个整数列表不是连续的——最小值可以是 1000,第二大的最小值可以是 10000。
使用分析函数
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 行(排名 <= 10).
请注意,此查询的性能将受益于“value”上的正确索引。
SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)
从账单中选择 min(fine_amount) 作为 secondary_min_fine_amount,其中fine_amount 不在其中(从账单中选择 min(fine_amount));