2010-10-19 8 views
5

¿Cómo podemos seleccionar la segunda marca más grande o lo que sea de una tabla sin usar el LÍMITE? Sé que es posible usar LIMIT, pero ¿es posible sin usar eso?Seleccione el segundo más grande de una tabla sin límite

Supongamos que tenemos las columnas id y marcas.

+2

¿Qué es lo que no te gusta de LIMIT? – Unreason

+0

que fue una pregunta de la entrevista;) – viMaL

+0

Creo que la pregunta pudo haber sido resolverlo sin usar ORDER BY y LIMIT. desde el pedido requiere ordenar en O (n * log (n)), mientras que el entrevistador buscaba O (n) – dharm0us

Respuesta

7

Asumir marcas es único, la siguiente consulta le da la segunda marca más grande.

SELECT MAX(marks) 
FROM  ATable 
WHERE marks < (SELECT MAX(marks) FROM ATable) 

Para obtener el registro completo, usted podría terminar con esto en un INNER JOIN

SELECT t1.* 
FROM ATable t1 
     INNER JOIN (
      SELECT marks = MAX(marks) 
      FROM  ATable 
      WHERE marks < (SELECT MAX(marks) FROM ATable) 
     ) t2 ON t2. marks = t1.marks 
+0

Para MySql: seleccione * de una tabla donde marks = (seleccione max (marcas) como secmax de atable donde marcas < (seleccione max (marks) from atable)) – dharm0us

+0

es '(SELECT MAX (marks) FROM ATable)' que se va a cobrar o se ejecuta esta consulta para cada línea? debido a que este enfoque es muy lento en una tabla con aproximadamente 1000 filas, gracias –

+1

@Gabriel: tenga en cuenta que la consulta solo devuelve una sola fila. En una tabla indexada adecuada, esto da como resultado un análisis de índice y un índice de búsqueda. Esto no debería ser un problema para cualquier motor de base de datos que valga la pena. –

1
select max(number), id 
from <tableName> 
where number < (select max(number) from <tableName>) 
0

Usted podría hacer un límite

SELECT MAX(marks) FROM TABLE 
WHERE marks NOT IN (SELECT MAX(marks) FROM TABLE) 

pero debería funcionar mejor, lo anteriormente expuesto, entonces la pregunta es por qué no te gusta?

0

Si necesita toda la fila (todas las columnas), esta lo hará. Además, siempre devolverá solo una fila, incluso si hay varias con el mismo segundo valor máximo.

Select top 1 * 
    From (Select Top 2 * 
      From TABLE 
     Order By marks desc 
     ) a 
Order By marks asc 

Si desea sólo una fila con el valor máximo segunda real, se debe utilizar:

select Top 1 * 
    from TABLE 
where marks < (select max(marks) from TABLE) 
Order by max desc 

Podría hacerse mediante la CTE (SQL Server 2005 +) también:

;With a as 
(
Select Dense_Rank() over (order by marks desc) as nRank, 
     * 
    From TABLE 
) 
Select Top 1 * 
    from a 
Where nRank=2 

Si desea ver todas las filas con la segunda marca máxima, simplemente elimine TOP 1 de la consulta anterior.

Cuestiones relacionadas