1

我是 SQL 新手,想知道是否可以在不使用SELECT TOPthen的情况下选择底部的 n 行ORDER BY

SELECT TOP我可以找到许多用& 然后模仿这个想法的例子,ORDER BY例如如何选择最底部的行?但我需要保持我的数据以相反的顺序排序,所以使用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)

我希望可以通过 SQLSELECT BOTTOM不使用ORDER BY; 否则我将不得不在另一个程序中的 SQL 查询之后翻转数据

4

2 回答 2

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
于 2013-07-16T16:41:18.540 回答
1

您可以将其包装在另一个查询中并按您需要的顺序放置...

SELECT x.* 
FROM   (
       SELECT TOP 504 
              "date",
              price
       FROM   [dbo].[AssetRet]
       WHERE  asset = 'SP500'
       ORDER BY "date" DESC
       ) x 
ORDER BY x."date"

这种替代方法有效吗?...您将需要更高版本的 sql-server 用于分区功能RANK...

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" 

编辑
看起来这个其他答案几乎涵盖了你的问题

于 2013-07-16T16:38:15.630 回答