2011-11-18 22 views
7

Necesito escribir una consulta que selecciona un valor mínimo y es el segundo valor más mínimo de una lista de enteros.Seleccione el segundo valor más mínimo en Oracle

Agarrando el valor más pequeño es obvia:

select min(value) from table; 

Pero el segundo más pequeño no es tan obvio.

Para el registro, esta lista de números enteros no es secuencial - el mínimo puede ser de 1000, y el segundo más minutos puede ser 10000.

Respuesta

15

utilizar una función analítica

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

Las funciones analíticas RANK, DENSE_RANK y ROW_NUMBER son idénticos excepto por la forma en que manejan los lazos. RANK usa un proceso de estilo deportivo para romper las ligaduras, de modo que si dos filas se empatan para un rango de 1, la siguiente fila tiene un rango de 3. DENSE_RANK da a las dos filas empatadas en primer lugar un rango de 1 y luego asigna la siguiente fila un rango de 2. ROW_NUMBER rompe arbitrariamente el empate y otorga a una de las dos filas con el valor más bajo un rango de 1 y el otro un rango de 2.

+0

+1 La misma solución que publiqué, pero con una buena explicación adicional de la diferencia entre las tres funciones analíticas similares. – GolezTrol

+0

Funciones analíticas! ¿Por qué no pensé en ellos antes? Agradezco la ayuda y la explicación. – ryebr3ad

5
SELECT MIN(value) 
FROM TABLE 
WHERE Value > (SELECT MIN(value) FROM TABLE) 
+0

Tenga en cuenta que esto requiere golpear la mesa dos veces por lo que será más caro que la solución de función analítica. Tal como está escrito, también es difícil extenderlo cuando quiere la tercera, quinta o décima fila. Podría hacer un COUNT (*) del número de filas en la tabla que tienen un valor menor que la fila actual de la consulta externa, que es más fácil de extender pero mucho menos eficiente. –

+0

@JustinCave - todos los puntos válidos – JNK

+0

Volví a subir tu solución porque es inteligente, pero yo no usaría eso. – Benoit

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

Ventaja: Usted puede obtener el tercer valor igual de fácil, o las 10 filas inferiores (rango < = 10).

Tenga en cuenta que el rendimiento de esta consulta se beneficiará de un índice adecuado de 'valor'.

Cuestiones relacionadas