2014-07-31

Enésimo valor más alto de una columna con SQL

Title Para seleccionar el enésimo valor más alto de una columna en Mc Access, creamos una consulta en vista SQL. En ella anidamos una consulta dentro de otra, mediante una subconsulta entre paréntesis. Este tipo de consulta no podemos crearla en vista diseño, necesitamos abrir la consulta en vista SQL y escribir el código.

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

Nube de datos