2011-08-21 2 views
7

Мы можем выбрать строку Top 10 или Select Top 'N' с SQL Server.Пропустить первую строку в SQL Server 2005?

Но есть ли способ пропустить первый ряд из результата сверху?

Я имею в виду, что я получаю результат от select top 5, тогда я пропускаю первую строку и получаю только следующие 4 строки?

ответ

10

Вы можете использовать OVER положение и ранжирования функции. Вы не можете фильтровать это напрямую, поэтому вам нужен суб-запрос или общее табличное выражение, в приведенном ниже примере используется последний.

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 

Там будет лучшая поддержка пагинацией в следующей версии SQL Server (кодовое название Denali) с OFFSET и FETCH ключевых слов.

+0

Отлично ... я не думал в этом направлении. я пытался выбрать с топ-5, затем из того, что я пытался пропустить первое слово «skip» ... Большое спасибо ... :-) –

+1

+1 для упоминания это функция ранжирования - это делает это четным более полезный ответ – Sascha

+0

+1 для 'OFFSET' и' FETCH' информации .. – dotNETbeginner

5

Вы могли бы сделать что-то вроде этого:

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

Update:

Обновлено иметь свои значения.

Update 2:

Исправлена ​​ошибка с отсутствующим подзапросом. Спасибо Крису Дайверу, указав это.

+0

Спасибо .. ваше решение тоже работает .. :-) –

+3

Вы не можете фильтровать без подзапроса, это не сработает. –

+0

Спасибо за указание моей ошибки – Sascha

2

Что-то вроде этого:

-- 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 
Смежные вопросы