如何从SQL Server查询结果中获取第n行(例如第5行)?
如何从SQL Server查询结果中获取第n行(例如第5行)?
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”以确定如何对数据进行排序,以获取第五行。截至2005年,ROW_NUMBER()函数已经可用。
SELECT * FROM
(
SELECT r.*, ROW_NUMBER() OVER (ORDER BY SomeField ASC) AS RowNum
) sorty
WHERE RowNum = 5
根据这个链接,您有很多选择。所有这些技术都适用于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()。
--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和窗口函数,您可以完全自由地按照自己的方式输出数据。
SELECT TOP 1 EmpID
FROM (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T
ORDER BY Emp DESC
比你要求的多/不同,但这里有一些东西: 假设你需要找到一个表的第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的限制,删除了一些内容
简单
-- 返回第一条记录
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)