SQL Server SELECT最后N行
这是一个已知的问题,但我find的最好的解决scheme是这样的:
SELECT TOP N * FROM MyTable ORDER BY Id DESC
我有一个有很多行的表。 使用该查询不是一个可能性,因为它需要很多时间。 那么我怎样才能select最后N行而不使用ORDER BY呢?
编辑
对不起, 这个重复的问题
你也可以通过使用行号分区function来完成。 一个很好的例子可以在这里find:
我正在使用Northwind数据库的Orders表…现在,让我们检索Employee 5放置的Last 5 Order:
SELECT ORDERID, CUSTOMERID, OrderDate FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,* FROM Orders ) as ordlist WHERE ordlist.EmployeeID = 5 AND ordlist.OrderedDate <= 5
您可以使SQL服务器使用此SQLselect最后N行:
select * from tbl_name order by id desc limit N;
我testing了JonVD的代码,但发现它很慢,6s。
这段代码花了0s。
SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate FROM Orders where EmployeeID=5 Order By OrderDate DESC
如果你想从表中select最后的行数。
语法会像
select * from table_name except select top (numbers of rows - how many rows you want)* from table_name
这些陈述有效但方式不同。 感谢你们。
select * from Products except select top (77-10) * from Products
这样你可以得到最后10行,但顺序会显示descnding方式
select top 10 * from products order by productId desc
select * from products where productid in (select top 10 productID from products) order by productID desc
select * from products where productID not in (select top((select COUNT(*) from products ) -10 )productID from products)
是“编号”索引? 如果没有,这是一个重要的事情要做(我怀疑它已经索引)。
另外,你是否需要返回所有列? 如果您实际上只需要ID列上的索引可以充分满足的列的较小子集,例如,如果您在Id列上有一个NONCLUSTERED索引,而没有其他索引,则可能会显着提高速度字段包含在索引中,那么它将不得不对聚集索引进行查找,以便实际获得剩余的列以返回,这可能会占用大量的查询成本。 如果它是一个CLUSTERED索引,或者是一个NONCLUSTERED索引,包括你想在查询中返回的所有其他字段,那么你应该没问题。
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
首先你得到的logging数最多
Declare @TableRowsCount Int select @TableRowsCount= COUNT(*) from <Your_Table>
接着 :
在SQL Server 2012中
SELECT * FROM <Your_Table> As L ORDER BY L.<your Field> OFFSET <@TableRowsCount-@N> ROWS FETCH NEXT @N ROWS ONLY;
在SQL Server 2008中
SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, * FROM <Your_Table> Order By <your Field> ) AS TempTable WHERE sequencenumber > @TableRowsCount-@N
这里有一些你可以尝试没有order by
但我认为这需要每一行都是唯一的。 N
是你想要的行数, L
是表中的行数。
select * from tbl_name except select top LN * from tbl_name
如前所述,返回的行是未定义的。
编辑:这实际上是狗慢。 没有价值真的。
在这里非常一般的方式和支持SQL服务器
SELECT TOP(N) * FROM tbl_name ORDER BY tbl_id DESC
并且对于性能来说,这并不差(对于服务器计算机上的超过10,000条logging,less于一秒)
这可能不太适合这个问题,但是…
OFFSET子句
OFFSET number
子句使您可以跳过多个行,然后返回行。
该doc链接到Postgres; 我不知道这是否适用于Sybase / MS SQL Server。
这个查询以正确的顺序返回最后N行,但是性能很差
select * from ( select top N * from TableName t order by t.[Id] desc ) as temp order by temp.[Id]
DECLARE @MYVAR NVARCHAR(100) DECLARE @step int SET @step = 0; DECLARE MYTESTCURSOR CURSOR DYNAMIC FOR SELECT col FROM [dbo].[table] OPEN MYTESTCURSOR FETCH LAST FROM MYTESTCURSOR INTO @MYVAR print @MYVAR; WHILE @step < 10 BEGIN FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR print @MYVAR; SET @step = @step + 1; END CLOSE MYTESTCURSOR DEALLOCATE MYTESTCURSOR
我使用一种技术来查询非常大的表(超过一亿或十亿行)中的 最近的行,这限制了查询只读取最近的“N”百分比的“最近的行”。 这是真实世界的应用程序,例如我为非历史最近的天气数据,或最近的新闻馈送search或最近的GPS位置数据点数据。
如果您确实知道您的行在最近的5%的表中,这是一个巨大的性能提升 。 这样,即使表中有索引,它也进一步将可能性限制在只有5%的行中有1亿或10亿行。 当旧数据需要物理磁盘读取而不仅仅是逻辑内存读取时,情况尤其如此。
这比SELECT TOP |更有效率 PERCENT | LIMIT,因为它不会select行,而只是限制要search的数据部分。
DECLARE @RowIdTableA BIGINT DECLARE @RowIdTableB BIGINT DECLARE @TopPercent FLOAT -- Given that there is an Sequential Identity Column -- Limit query to only rows in the most recent TOP 5% of rows SET @TopPercent = .05 SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB SELECT * FROM TableA a INNER JOIN TableB b ON a.KeyId = b.KeyId WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND a.SomeOtherCriteria = 'Whatever'
要显示最后3行而不使用以下order by
:
select * from Lms_Books_Details where Book_Code not in (select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details)
尝试使用EXCEPT
语法。
像这样的东西:
SELECT * FROM clientDetails EXCEPT (SELECT TOP (numbers of rows - how many rows you want) * FROM clientDetails)