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.
Use an analytic function
The analytic functions
RANK,DENSE_RANK, andROW_NUMBERare identical except for how they handle ties.RANKuses 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_RANKgives both of the rows tied for first place a rank of 1 and then assigns the next row a rank of 2.ROW_NUMBERarbitrarily 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.