2010-06-15 24 views
9

¿Cómo recupero el segundo valor más alto de una tabla?Recuperando el segundo valor más alto de una tabla

+1

puede usted por favor, puesto que su estructura de la tabla y lo que has probado hasta ahora? – oezi

+3

Y el dialecto SQL que está utilizando. Hasta ahora, hay dos respuestas aparentemente relacionadas con MySQL, pero supongo que ambas no funcionarían con ningún otro DBMS. – Joey

+1

La pregunta se vuelve más interesante si tiene varios grupos en la tabla, por ejemplo, una columna LAST_NAME, y para cada LAST_NAME desea recuperar a la persona con la segunda EDAD más alta. ¿Es ese el caso, o solo quieres el segundo más alto de toda la mesa? – thomaspaulb

Respuesta

6

En MySQL se podría utilizar, por ejemplo, LIMIT 1, 1:

SELECT col FROM tbl ORDER BY col DESC LIMIT 1, 1 

Véase el MySQL reference manual: SELECT Syntax).

La cláusula LIMIT se puede utilizar para limitar el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, que deben ser constantes enteras no negativas (excepto cuando se usan declaraciones preparadas).

Con dos argumentos, el primer argumento especifica el desplazamiento de la primera fila a devolver, y el segundo especifica el número máximo de filas a devolver. El desplazamiento del registro inicial es 0 (no 1):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15 
+0

ordenando por el número que desea obtener el segundo más alto de. – icio

+0

Gracias. Actualizado – aioobe

1

Tal vez:

SELECT * FROM table ORDER BY value DESC LIMIT 1, 1 
+0

¿Tal vez ...? Por cierto, si sangras tu código en cuatro espacios obtendrás un resultado más bonito. – Patrick

11
select max(val) from table where val < (select max(val) form table) 
2
SELECT E.lastname, E.salary FROM employees E 
WHERE 2 = (SELECT COUNT(*) FROM employess E2 
      WHERE E2.salary > E.salary) 

Tomado de here
Esto funciona en casi todos Dbs

+0

Creo que> debe ser> =. Además, esto no funcionará si alguno de los valores mejor clasificados tiene entradas múltiples (por ejemplo, si hay dos empleados con el mismo salario más alto, y está tratando de obtener los empleados con el segundo salario más alto) – potatopeelings

+0

no es eso obtener el tercero? Si tiene 2 valores más grandes ... pero por lo demás se ve color de rosa. – ANeves

2
Select Top 1 sq.ColumnToSelect 
From 
(Select Top 2 ColumnToSelect 
From MyTable 
Order by ColumnToSelect Desc 
)sq 
Order by sq.ColumnToSelect asc 
0

una solución sería la siguiente:

SELECT var FROM table ORDER BY var DESC LIMIT 1,1 
5

seleccione la parte superior 2 nombre_campo de fin nombre_tabla por desc límite nombre_campo 1

+1

Cuando usa límite no puede usar TOP Arriba es para SQL Server – Madhivanan

2

fresca, esto es casi como Código de golf.

Microsoft SQL Server 2005 y superior:

SELECT * 
FROM (
    SELECT 
     *, 
     row_number() OVER (ORDER BY var DESC) AS ranking 
    FROM table 
) AS q 
WHERE ranking = 2 
+0

Debería usar 'DENSE_RANK' para tener en cuenta las relaciones. –

2

probar este

SELECT * FROM 
(SELECT empno, deptno, sal, 
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC NULLS LAST) DENSE_RANK 
FROM emp) 
WHERE DENSE_RANK = 2; 

Esto funciona tanto en Oracle y SQL Server.

+0

Tu código genera un error de sintaxis en SQL Server. Sin duda, podría ser portado, sin embargo. – onedaywhen

1

Prueba este

SELECT TOP 1 Column FROM Table WHERE Column < (SELECT MAX(Column) FROM Table) 
ORDER BY Column DESC 

SELECT TOP 1 Column FROM (SELECT TOP <n> Column FROM Table ORDER BY Column DESC) 

ORDER BY ASC

cambio del n para obtener el valor de cualquier posición

Cuestiones relacionadas