SELECT TOP 1 * FROM (SELECT TOP 2 * FROM Tabla ORDER BY Columna DESC) AS Tabla ORDER BY Columna;En primer lugar, la subconsulta ordena descendentemente tantas filas como el número de la fila que queremos obtener, 2 en el ejemplo. La fila objetivo será esa última. Finalmente, la consulta ordena ascendente el resultado y selecciona solamente la primera fila. Si en lugar del segundo valor más alto queremos el vigésimo, escribimos TOP 20 dentro de la subconsulta.
El problema del código anterior es que no excluye los duplicados del cálculo. Y devuelve tantas filas como duplicados de ese valor.
En la columna anterior devolvería incorrectamente el 144.000 como segundo valor más alto en lugar del 52.936.
Alternativa 1
Para sortear ese problema empleamos el siguiente código:
SELECT TOP 1 * FROM (SELECT TOP 2 * FROM (SELECT DISTINCT Columna FROM Tabla) ORDER BY Columna DESC) ORDER BY Columna;La estructura es idéntica al código anterior. En lugar de introducir la Tabla al inicio de la subconsulta, introducimos una subconsulta adicional con la función DISTINCT para listar los elementos no duplicados. De esta manera obtenemos el enésimo valor más alto correctamente excluyendo los duplicados.
Alternativa 2
Otra opción en el caso de que busquemos el segundo valor más alto:
SELECT Max(Columna) AS Segundo_valor FROM Tabla WHERE ((Columna)<(SELECT MAX(Columna) FROM Tabla));Selecciona el valor máximo de la columna de aquellas filas donde el valor de la misma sea menor que el máximo valor de la columna. Es decir el segundo valor más alto. El inconveniente respecto a la consulta anterior es que no nos permite localizar el enésimo valor más alto, solamente el segundo.
Referencias:
Stackoverflow
No hay comentarios:
Publicar un comentario