2010-04-03 10 views
6

Estoy tratando de obtener los N registros superiores (cuando lo pide una columna X), pero el resultado se ha configurado en orden inverso. La siguiente declaración es incorrecta , pero probablemente demuestra lo que busco:Seleccionar los N registros ordenados por X, pero tener resultados en orden inverso

SELECT * FROM (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) ORDER BY X ASC 

Por ejemplo, la columna X podría ser un ID o una marca de tiempo; Quiero los últimos 10 registros pero quiero que se devuelvan en orden cronológico directo.

+1

Por qué no SELECT * FROM TOP 10 ORDEN FooTable por X ASC'? – Dor

+0

@Dor Porque entonces obtendría los últimos 10 registros, pero serían devueltos en orden cronológico inverso. –

Respuesta

9
SELECT * FROM 
    (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) as myAlias 
ORDER BY X ASC 

es decir, es posible que tenga un alias en su subconsulta, pero aparte de eso debería funcionar.

+0

Bien, gracias. Aunque no entiendo muy bien por qué SQL exige un alias cuando no hay referencia en otra parte de la consulta. –

2

Trate

SELECT * FROM 
(SELECT TOP 10 * FROM FooTable ORDER BY X DESC) temp --alias 
ORDER BY X 

o con una expresión de tabla común (CTE)

WITH Temp AS (SELECT TOP 10 * FROM FooTable ORDER BY X DESC) 

SELECT * FROM temp 
ORDER BY X 
1

cláusula ORDER BY se utiliza para ordenar el conjunto de resultados por una columna especificada.

Su consulta Select TOP 10 * from FooTable ORDER BY X DESC suponiendo que X es la marca de tiempo, no va a devolver las 10 filas insertadas más recientemente. Devolverá las 10 filas superiores almacenadas (en cualquier orden) en la Base de datos, y luego devolverá el conjunto de resultados de las 10 filas, en orden descendente. De ahí su subconsulta debe ser modificado para

Select TOP 10 * from (Select * from FooTable ORDER BY DESC) as T

Esto debe cumplir con su primer requisito. Luego puede usar este conjunto de resultados como un alias para decidir su orden de clasificación final.

espero que le he entendido bien, cuando se dice "que estoy tratando de conseguir los mejores registros N (cuando es ordenado por alguna columna X)"

0

Una solución alternativa a esta pregunta no para todos -supported versions for TOP palabra clave es usar LIMITE. Ejemplo: -

SELECT * FROM 
    (SELECT * FROM FooTable ORDER BY X DESC LIMIT 10) as myAlias 
ORDER BY X ASC 
Cuestiones relacionadas