2011-08-21 1 views
7

Possiamo selezionare la riga Top 10 o Select Top 'N' da SQL Server.Ignora la prima riga in SQL Server 2005?

Ma c'è un modo per saltare la prima riga dal risultato di top ??

Voglio dire, ottengo il risultato da select top 5, quindi salterò la prima riga e otterrò solo le prossime 4 righe?

risposta

10

È possibile utilizzare OVER clausola e una funzione di posizionamento. Non è possibile filtrare direttamente su questo, quindi è necessario per noi una query secondaria o un'espressione di tabella comune, l'esempio seguente utilizza quest'ultimo.

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 

Non ci sarà un migliore supporto per l'impaginazione nella prossima versione di SQL Server (nome in codice Denali) con le OFFSET e FETCH parole chiave.

+0

Grande ... non ho pensato in questa direzione. Stavo cercando di selezionare con la top 5, quindi da quello che stavo cercando di saltare il primo con la parola 'skip' ... Grazie mille ... :-) –

+1

+1 per aver menzionato una funzione di classifica - che rende questo anche un risposta più utile – Sascha

+0

+1 per le informazioni 'OFFSET' e' FETCH' .. – dotNETbeginner

5

Si potrebbe fare qualcosa di simile:

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

Aggiornamento:

Aggiornamento per avere i vostri valori.

Aggiornamento 2:

Corretto errore con domanda secondaria mancante. Grazie a Chris Diver che lo ha sottolineato.

+0

Grazie .. anche la tua soluzione funziona .. :-) –

+3

Non puoi filtrare senza subquery, questo non funzionerà. –

+0

Grazie per aver segnalato il mio errore – Sascha

2

Qualcosa di simile a questo:

-- 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