如何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]