Select second most minimum value in Oracle

喜夏-厌秋 提交于 2019-11-28 00:34:46

问题


I need to write a query that selects a minimum value and it's second most minimum value from a list of integers.

Grabbing the smallest value is obvious:

select min(value) from table;

But the second smallest is not so obvious.

For the record, this list of integers is not sequential -- the min can be 1000, and the second most min can be 10000.


回答1:


Use an analytic function

SELECT value
  FROM (SELECT value,
               dense_rank() over (order by value asc) rnk
          FROM table)
 WHERE rnk = 2

The analytic functions RANK, DENSE_RANK, and ROW_NUMBER are identical except for how they handle ties. RANK uses a sports-style process of breaking ties so if two rows tie for a rank of 1, the next row has a rank of 3. DENSE_RANK gives both of the rows tied for first place a rank of 1 and then assigns the next row a rank of 2. ROW_NUMBER arbitrarily breaks the tie and gives one of the two rows with the lowest value a rank of 1 and the other a rank of 2.




回答2:


select 
  value
from
  (select 
    value, 
    dense_rank() over (order by value) rank
  from 
    table)
where
  rank = 2

Advantage: You can get the third value just as easy, or the bottom 10 rows (rank <= 10).

Note that the performance of this query will benefit from a proper index on 'value'.




回答3:


SELECT MIN(value)
FROM TABLE
WHERE Value > (SELECT MIN(value) FROM TABLE)


来源:https://stackoverflow.com/questions/8188091/select-second-most-minimum-value-in-oracle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!