2011-08-21 12 views
7

Podemos seleccionar Top 10 o Select Top 'N' fila de SQL Server.¿Omite la primera fila en SQL Server 2005?

¿Pero hay alguna manera de saltear la primera fila del resultado de la parte superior?

Quiero decir, obtengo el resultado de select top 5, ¿entonces omito la primera fila y obtengo solo las siguientes 4 filas?

Respuesta

10

Usted puede utilizar OVER cláusula y una función de clasificación. No puede filtrar esto directamente, por lo que necesita una sub consulta o una expresión de tabla común, el ejemplo siguiente usa la última.

DECLARE @MyTable TABLE 
(
    ID INT, 
    Name VARCHAR(15) 
) 
INSERT INTO @MyTable VALUES (1, 'Alice') 
INSERT INTO @MyTable VALUES (2, 'Bob') 
INSERT INTO @MyTable VALUES (3, 'Chris') 
INSERT INTO @MyTable VALUES (4, 'David') 
INSERT INTO @MyTable VALUES (5, 'Edgar') 

;WITH people AS 
(
    SELECT ID, Name, ROW_NUMBER() OVER (ORDER BY ID) RN 
    FROM @MyTable 
) 
SELECT ID, Name 
FROM people 
WHERE RN > 1 

Habrá un mejor soporte para la paginación en la próxima versión de SQL Server (nombre en clave de Denali) con los OFFSET y FETCH palabras clave.

+0

Genial ... no pensé en esta dirección. estaba tratando de seleccionar entre los 5 primeros, entonces estaba tratando de omitir el primero con la palabra "saltar" ... Muchas gracias ... :-) –

+1

+1 por mencionar que es una función de clasificación, eso hace que sea más útil respuesta – Sascha

+0

+1 para información 'OFFSET' y 'FETCH' .. – dotNETbeginner

5

se podría hacer algo como esto:

SELECT 
    * 
FROM (
     SELECT  
      row_number() OVER (ORDER BY ID DESC) AS [rownum], 
      * 
     FROM 
      tbl 
) T 
WHERE 
    rownum BETWEEN (2) AND (5) 

Actualización:

Actualizado a tener sus valores.

Actualización 2:

Corregido error con consulta sub faltante. Gracias a Chris Diver señalando esto.

+0

Gracias ... tu solución también funciona ... :-) –

+3

No puedes filtrar sin una subconsulta, esto no funcionará. –

+0

Gracias por señalar mi error – Sascha

2

Algo como esto:

-- Test table 
declare @T table(ID int) 

-- Add test data 
insert into @T 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 

-- Query using row_number() over(...) 
-- to get rows 2 - 5 
select T.ID 
from (
     select *, 
       row_number() over(order by ID) as rn 
     from @T  
    ) as T 
where T.rn between 2 and 5 
Cuestiones relacionadas