2011-08-21 3 views
7

Możemy wybrać wiersz Top 10 lub Select Top 'N' z SQL Server.Pomiń pierwszy wiersz w SQL Server 2005?

Ale czy istnieje sposób na pominięcie pierwszego rzędu od wyniku top ??

Mam na myśli wynik z select top 5, a następnie pomijam pierwszy wiersz i otrzymuję tylko kolejne 4 wiersze?

Odpowiedz

10

Można użyć OVER klauzuli i rankingową funkcję. Nie możesz filtrować bezpośrednio, więc potrzebujesz do nas zapytania dodatkowego lub wspólnego wyrażenia tabelowego, poniższy przykład używa tego drugiego.

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 

Nie będzie lepsze wsparcie dla paginacji w następnej wersji SQL Server (nazwa kodowa Denali) z OFFSET i FETCH słów kluczowych.

+0

Świetnie ... nie myślałem w tym kierunku. Próbowałem wybrać top 5, a następnie próbowałem pominąć pierwszy ze słowem "pomiń" ... Wielkie dzięki ... :-) –

+1

+1 za wzmiankę o funkcji rankingowej - dzięki temu jest to równomierne bardziej przydatna odpowiedź: – Sascha

+0

+1 dla informacji "OFFSET" i "FETCH" .. – dotNETbeginner

5

Można zrobić coś takiego:

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

Aktualizacja:

Updated mieć swoje wartości.

Aktualizacja 2:

Poprawiono błąd z brakującymi zapytania sub. Dzięki Chris Diver wskazuję to.

+0

Dzięki .. twoje rozwiązanie też działa .. :-) –

+3

Nie możesz filtrować bez podkwerendy, to nie zadziała. –

+0

Dzięki za wskazanie mojego błędu – Sascha

2

coś takiego:

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