这是一个已知的问题,但我找到的最佳解决方案类似于:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
我有一张有很多行的表。不可能使用那个查询语句因为它需要很长的时间。那么如何选择最后N行而不使用ORDER BY?
编辑
抱歉,这是重复的问题
这是一个已知的问题,但我找到的最佳解决方案类似于:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
我有一张有很多行的表。不可能使用那个查询语句因为它需要很长的时间。那么如何选择最后N行而不使用ORDER BY?
编辑
抱歉,这是重复的问题
您可以使用以下查询语句让SQL Server选择最后N行:
select * from tbl_name order by id desc limit N;
我测试了JonVD的代码,但发现它非常慢,需要6秒。
这段代码只需0秒。
SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate
FROM Orders where EmployeeID=5
Order By OrderDate DESC
OrderDate
进行了索引,那么选择查询的前 N 行或后 N 行应该是同样快的。我知道 OrderDate
可能与插入顺序相关,但这最多只是一个副作用,并且仍然需要进行表扫描,不是吗?(而且我认为它并没有回答 OP 所指出的 更好的重复问题:即在不排序的情况下选择最后 5 行) - ruffin我正在使用Northwind数据库的订购表... 现在,让我们检索由Employee 5放置的最后5个订单:
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
如果您想从表中选择最后几行的数据。
语法将如下所示
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行,但是顺序将以降序显示
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)
非常一般化的说,为了支持SQL服务器,这里是:
SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC
就性能而言,它并不差(在服务器上处理超过10,000条记录不到一秒钟)。
首先,您需要从中获取记录计数
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
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
我使用的一种查询大型表中最近行的技术是将查询限制为仅“读取”最近“N”个百分比的行。这是现实世界的应用,例如,我针对非历史性的最新天气数据、最新新闻订阅或最新GPS位置数据点进行此操作。
如果您确信自己的行位于表的最近前5%(例如),那么这将是一个巨大的性能提升。即使表上有索引,它也只会进一步将可能性限制在具有1亿个或10亿个行的表中的5%的行。当较旧的数据需要进行物理磁盘读取而不仅仅是逻辑内存读取时,情况就尤其如此。
与SELECT TOP | PERCENT | LIMIT相比,这要更加高效,因为它不会选择行,而仅限制要搜索的数据部分。
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'
SELECT Col1
FROM Table1
WHERE TableIdCol >
(SELECT MAX(TableIdCol)-20000
from Table1)
ORDER BY TableIdCol1;
- Rashi Abramson以下是一种不需要使用 order by
的方法,但我认为它要求每行都是唯一的。其中 N
表示你想要的行数,L
是表中的行数。
select * from tbl_name except select top L-N * from tbl_name
如前所述,返回哪些行是未定义的。
编辑:实际上这非常缓慢。真的没有什么价值。
id
已经被索引,那么它只需要反向扫描该索引并在找到前5行后停止。如果没有被索引,那么它将需要进行TOP N
排序。这不会比其他任何方法更糟糕。它不会对整个表进行排序(尽管需要扫描整个表)。 - Martin SmithROW_NUMBER OVER PARTITION BY
来执行这种类型的查询要比其他方法快得多。所以,就我个人而言,很高兴它被标记为被接受的答案,其他条件都相同的情况下。 - Reversed Engineer