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)