我是SQL的新手,想知道是否可以在不使用SELECT TOP
然后ORDER BY
的情况下选择底部n行。
我可以通过SELECT TOP
&找到许多模仿这个想法的例子。那么ORDER BY
例如How to select bottom most rows?但我需要按相反的顺序对数据进行排序,因此使用ORDER BY
并不理想。
我的下面的查询返回了我需要传递给其他程序的数据点,但现在数据的排序方向与所需方向相反,会导致问题。
SELECT TOP 504
date
,price
FROM
[dbo].[AssetRet]
WHERE
asset = 'SP500'
ORDER BY
date DESC
我可以通过在date
上删除TOP
上的过滤器来解决这个问题,但我不知道该怎么做,即:。
WHERE
date > Min(Select DISTINCT TOP 504 date FROM [dbo].[AssetRet] ORDER BY date DESC)
我希望通过SQL可以SELECT BOTTOM
没有ORDER BY
;否则我将不得不在其他程序中的SQL查询之后翻转数据
答案 0 :(得分:2)
我不完全明白你所追求的是什么,但你可以使用ROW_NUMBER()
代替顶部/底部,如果你愿意,可以用它来获得TOP和BOTTOM:
SELECT date, price
FROM (SELECT date
, price
, ROW_NUMBER() OVER (ORDER BY date ASC) 'RowRankASC'
, ROW_NUMBER() OVER (ORDER BY date DESC) 'RowRankDESC'
FROM AssetRet
WHERE asset = 'SP500'
)sub
WHERE RowRankASC <= 504
OR RowRankDESC <= 504
ORDER BY date
答案 1 :(得分:1)
您可以将其包装在另一个查询中,并按您需要的顺序...
SELECT x.*
FROM (
SELECT TOP 504
"date",
price
FROM [dbo].[AssetRet]
WHERE asset = 'SP500'
ORDER BY "date" DESC
) x
ORDER BY x."date"
这个替代方案有用吗?...对于分区函数RANK
,您将需要更高版本的sql-server ...
SELECT x."date",
x.price
FROM (
SELECT "date",
price,
Rnk = RANK() OVER (ORDER BY "date" DESC)
FROM [dbo].[AssetRet]
WHERE asset = 'SP500'
) x
WHERE x.Rnk <= 504
ORDER BY x."date"
修改强>
看起来 this other answer 几乎涵盖了您的问题