跳过SQL Server 2005的第一行?

时间:2011-08-21 11:05:54

标签: sql sql-server sql-server-2005 tsql

我们可以从SQL Server中选择Top 10Select Top 'N'行。

但是有没有办法从顶部的结果中跳过第一行?

我的意思是我从select top 5获得结果,然后我跳过第一行并且只获得接下来的4行?

4 个答案:

答案 0 :(得分: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

使用OFFSETFETCH关键字在下一版本的SQL Server(代号Denali)中将更好地支持分页。

答案 1 :(得分:5)

你可以这样做:

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

<强>更新

已更新以获取您的值。

更新2:

更正了缺少子查询的错误。感谢Chris Diver指出这一点。

答案 2 :(得分:2)

您正在寻找的是术语分页。 像这样:http://www.15seconds.com/issue/070628.htm

答案 3 :(得分: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