如何获取SQL Server表中的第n行?

时间:2010-02-16 14:29:31

标签: sql sql-server

如何从SQL Server中的查询结果中获取第n行(即第5行)?

7 个答案:

答案 0 :(得分:21)

SQL Server 2005及更新版本:

with Records AS(select row_number() over(order by datecreated) as 'row', * 
                from Table)
select * from records
where row=5

您可以更改顺序,以确定如何对数据进行排序以获得第五行。

在我本地安装上测试:Microsoft SQL Server 2005 - 9.00.4053.00(X64)2009年5月26日14:13:01版权所有(c)1988-2005 Microsoft Corporation Developer Edition(64位)在Windows NT 6.1上(Build 7600:)

答案 1 :(得分:10)

截至2005年,ROW_NUMBER()函数可用。

SELECT * FROM
(
   SELECT r.*, ROW_NUMBER() OVER (ORDER BY SomeField ASC) AS RowNum
) sorty
WHERE RowNum = 5

答案 2 :(得分:8)

根据this link,您有很多选择。所有这些技术都适用于SQL 2000.我之前使用过的是选项#1,你可以选择一个方向排序的5个元素子集,然后选择另一个方式排序的子集中的“TOP”行。效果很好!

SELECT TOP 1 FName 
FROM 
( 
    SELECT TOP 5 FName 
    FROM Names 
    ORDER BY FName 
) sub 
ORDER BY FName DESC 

在SQL 2005及更高版本中,它更容易 - 您可以使用ROW_NUMBER()这样的行排序函数来直接执行所需的操作。

答案 3 :(得分:3)


您可以使用公用表表达式(CTE)和窗口函数ROW_NUMBER()(SQL 2005的兼容性)来解决您的问题。

我们假设表名是tableOne,它有三列(col1,col2,col3)

要完成定义,您需要指定您希望行编号的顺序。以下脚本可以帮助您获取表的第n行。


--table definition
create table tableOne
(
    col1 varchar(10)
    ,col2 varchar(10)
    ,col3 varchar(10)
)
go
-- sample data creation
insert into tableOne VALUES ('c11','c12','c13')
insert into tableOne VALUES ('c21','c22','c23')
insert into tableOne VALUES ('c31','c32','c33')
insert into tableOne VALUES ('c41','c42','c43')
insert into tableOne VALUES ('c51','c52','c53')
insert into tableOne VALUES ('c61','c62','c63')
go
-- obtaining nth row using CTE and Window Function
WITH NthRowCTE AS
(
    SELECT
        ROW_NUMBER() OVER (ORDER BY col1) AS RNum
        , *
    FROM tableOne
)
SELECT * FROM NthRowCTE WHERE RNum = 5
GO

使用CTE和窗口功能,您可以完全灵活地以您希望的方式输出数据。

答案 4 :(得分:2)

如果您使用的是SQL Server 2005或更高版本,则可以使用CTE功能。否则您可以使用此简单查询

SELECT TOP 1 EmpID  
FROM  (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T
ORDER BY Emp DESC 

答案 5 :(得分:0)

BIT比你要求的更多/不同,但这里有一些东西: 假设您需要在特定日期时间序列中找到一个表的第n行,并且如果其唯一标识符不在另一个表中,则将其中的值插入另一个表中。这从第一个表的第n行获取值。 myuniquecol是一个标识符/ col,用于标识第一个表中具有相同值的行组,这些行具有唯一的mydatetime值

( SELECT TOP 1 mycol FROM
    ( SELECT TOP 5 * FROM  mytable
        WHERE mytable.myuniquecol NOT IN (select myuniquecol from myothertable)
        AND mytable.myuniquecol = myuniquecol
        ORDER BY myuniquecol asc, mydatetime desc
    ) AS me
  ORDER BY myuniquecol desc, mydatetime asc
) AS mycolnew

这对于在一个表中找到第n行并将其作为第n个col插入另一个表中非常有用。

table1:myuniquecol,mycol,mydatetime

table2:myuniquecol,mycol1,mycol2,mycol3 ......

应该适用于任何SQL:)

注意:mytable有一个名为mycol的列

编辑:因为TOP

上的SQL SERVER限制而取出了一些东西

答案 6 :(得分:0)

SIMPLE

- 返回第一条记录

从标题中选择*,其中1 =(从标题b中选择count(title_id),其中a.title_id> = b.title_id)

- 返回第二条记录,依此类推 select * from titles a where 2 =(select title(title_id)from titles b where a.title_id> = b.title_id)