选择BOTTOM而不更改ORDER BY

时间:2013-07-16 16:32:40

标签: sql sql-server sql-order-by

我是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查询之后翻转数据

2 个答案:

答案 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 几乎涵盖了您的问题