如何select最底部的行?

我可以做SELECT TOP(200)…但为什么不是BOTTOM(200)?

那么不要进入哲学我的意思是,我怎么能做相当于TOP(200),但相反(从底部,就像你期望BOTTOM做…)?

SELECT columns FROM ( SELECT TOP 200 columns FROM My_Table ORDER BY a_column DESC ) SQ ORDER BY a_column ASC 

这是没有必要的。 你可以使用一个ORDER BY ,只要改变DESC就可以得到相同的效果。

对不起,我不认为我看到了正确的答案。

TOP x函数以未定义的顺序显示logging。 从这个定义中, BOTTOM函数不能被定义。

独立于任何索引或sorting顺序。 当你做一个ORDER BY y DESC你会得到具有最高y值的行。 如果这是一个自动生成的ID,它应该显示最后添加到表中的logging,如其他答案中的build议。 然而:

  • 这只适用于有自动生成的id列
  • 如果将其与TOP函数进行比较,则会对性能产生显着影响

正确的答案应该是有,并不能等同于获得底部行的TOP

从员工select底部1000

 DECLARE @bottom int, @count int SET @bottom = 1000 SET @count = (select COUNT(*) from Employee) select * from Employee emp where emp.EmployeeID not in ( SELECT TOP (@count-@bottom) Employee.EmployeeID FROM Employee ) 

所有你需要做的是扭转你的ORDER BY 。 向其中添加或删除DESC

“Justin Ethier”目前接受的答案并不是“保护者之一”所指出的正确答案。

据我所知,截至目前,没有其他答案或评论提供了作者所要求的BOTTOM(x)的等价物。

首先,我们来考虑一个需要这个function的场景:

 SELECT * FROM Split('apple,orange,banana,apple,lime',',') 

这将返回一列和五个logging的表格:

  • 苹果
  • 橙子
  • 香蕉
  • 苹果
  • 青柠

正如你所看到的:我们没有一个ID列, 我们不能按退回的专栏sorting; 而且我们不能使用标准的SQL来select底部的两条logging,就像我们可以对前两条logging所做的那样。

这是我提供解决scheme的尝试:

 SELECT * INTO #mytemptable FROM Split('apple,orange,banana,apple,lime',',') ALTER TABLE #mytemptable ADD tempID INT IDENTITY SELECT TOP 2 * FROM #mytemptable ORDER BY tempID DESC DROP TABLE #mytemptable 

这是一个更完整的解决scheme:

 SELECT * INTO #mytemptable FROM Split('apple,orange,banana,apple,lime',',') ALTER TABLE #mytemptable ADD tempID INT IDENTITY DELETE FROM #mytemptable WHERE tempID <= ((SELECT COUNT(*) FROM #mytemptable) - 2) ALTER TABLE #mytemptable DROP COLUMN tempID SELECT * FROM #mytemptable DROP TABLE #mytemptable 

我决不是声称在任何情况下都是一个好主意,但它提供了预期的结果。

用另一种方式sorting的问题是,它通常不能很好地利用指数。 如果您需要select一些不在开始或结束的行数,它也不是非常可扩展的。 另一种方法如下。

 DECLARE @NumberOfRows int; SET @NumberOfRows = (SELECT COUNT(*) FROM TheTable); SELECT col1, col2,... FROM ( SELECT col1, col2,..., ROW_NUMBER() OVER (ORDER BY col1) AS intRow FROM TheTable ) AS T WHERE intRow > @NumberOfRows - 20; 

“汤姆H”上面的答案是正确的,它在我得到底5行。

 SELECT [KeyCol1], [KeyCol2], [Col3] FROM (SELECT TOP 5 [KeyCol1], [KeyCol2], [Col3] FROM [dbo].[table_name] ORDER BY [KeyCol1],[KeyCol2] DESC) SOME_ALAIS ORDER BY [KeyCol1],[KeyCol2] ASC 

谢谢。

尝试这个。

 declare @floor int --this is the offset from the bottom, the number of results to exclude declare @resultLimit int --the number of results actually retrieved for use declare @total int --just adds them up, the total number of results fetched initially --following is for gathering top 60 results total, then getting rid of top 50. We only keep the last 10 set @floor = 50 set @resultLimit = 10 set @total = @floor + @resultLimit declare @tmp0 table( --table body ) declare @tmp1 table( --table body ) --this line will drop the wanted results from whatever table we're selecting from insert into @tmp0 select Top @total --what to select (the where, from, etc) --using floor, insert the part we don't want into the second tmp table insert into @tmp1 select top @floor * from @tmp0 --using select except, exclude top x results from the query select * from @tmp0 except select * from @tmp1 

我想出了一个解决scheme,不需要你知道返回的行数。

例如,如果要获取表中logging的所有位置,除了最新的1(或2或5或34)

 SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY CreatedDate) AS Row, * FROM Locations WHERE UserId = 12345) AS SubQuery WHERE Row > 1 -- or 2, or 5, or 34 

查询一个简单的子查询sorting降序,然后sorting在同一列升序诀窍。

 SELECT * FROM (SELECT TOP 200 * FROM [table] t2 ORDER BY t2.[column] DESC) t1 ORDER BY t1.[column]