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

29

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


1
请澄清您的问题。您是要找第五行还是第五列? - John Saunders
2
由于问题的标题是“如何在SQL Server表中获取第n行”,我认为很明显他想要第五行,而不是第五列。 - mwigdahl
1
然后问题文本要求从一行中提取第5个值。因此引起了困惑。标题错了还是问题文本错了?你的猜测和我的一样好。 - Patrick Karcher
1
我理解这个问题,目前它已经有16个赞了。显然很多人都理解了它。对我来说,这似乎是一个真正的问题,不应该被关闭。 - Tony_Henrich
1
你可以使用偏移量和提取来完成。但是添加答案似乎被禁用了。 - MSIS
显示剩余3条评论
7个回答

28

SQL Server 2005及其更新版本:

with Records AS(select row_number() over(order by datecreated) as 'row', * 
                from Table)
select * from records
where row=5
您可以更改“order by”以确定如何对数据进行排序,以获取第五行。
在我本地安装的 Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 上测试通过:版权所有(c)1988-2005 Microsoft Corporation Developer Edition(64位),运行在 Windows NT 6.1 (Build 7600: ) 上。

运行得很好,但仅适用于SQL 2008。 - mwigdahl
2
不适用于我正在运行的 SQL 2005,也就是说出现了问题。 - JoshBerke
我的错误,2005年及以后的版本确实支持此功能。谢谢Josh! - mwigdahl

13

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

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

12

根据这个链接,您有很多选择。所有这些技术都适用于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()


4
ROW_NUMBER() 函数存在于 SQL Server 2005 及以后的版本中,它用于为结果集中的每一行分配一个唯一的数字序号。 - AdaTheDev
3
请注意,使用该方法时如果行数n < 5,则会返回第n行而不是空值。例如,如果Names表格中有4行,则将返回第4行。这可能是好的或坏的,具体取决于您的期望。 - David Sherret

4
你可以利用公共表达式(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
如果您使用的是 SQL Server 2005 或更高版本,则可以使用 CTE 功能。
否则,您可以使用此简单查询。
SELECT TOP 1 EmpID  
FROM  (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T
ORDER BY Emp DESC 

0

比你要求的多/不同,但这里有一些东西: 假设你需要找到一个表的第n行,在特定的日期时间序列上,并将其值插入到另一个表中,如果它的唯一标识符还没有在另一个表中。这会从第一个表的第n行获取值。 myuniquecol是一个标识符/列,用于标识在第一个表中具有唯一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列。

表1:myuniquecol,mycol,mydatetime

表2:myuniquecol,mycol1,mycol2,mycol3...

适用于任何SQL :)

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

编辑:由于SQL SERVER对TOP的限制,删除了一些内容


FYI,我这样做是因为问题有些模糊不清。 - Mark Schultheiss

-1

简单

-- 返回第一条记录

select * from titles a where 1 = (select count(title_id) from titles b where a.title_id >= b.title_id)

-- 返回第二条记录以及之后的记录 select * from titles a where 2 = (select count(title_id) from titles b where a.title_id >= b.title_id)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接