2013-07-16 25 views
1

我是新来的SQL,不知道是否有可能选择底部n行,而无需使用SELECT TOP &然后ORDER BY选择底不改变ORDER BY

我能找到mimicing与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查询之后翻转数据

回答

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服务器的分区功能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" 

编辑
貌似this other answer漂亮很多涵盖了你的问题

+0

第一个查询包装工作得很好。非常感谢 – TylerDurden

+0

没问题 - 很高兴能提供帮助 - 您使用的是什么版本的sql-server?第二个建议不起作用吗? – whytheq

+0

第二个建议也很完美,谢谢....第一个建议似乎更容易实现 – TylerDurden

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 
+0

+1 ....认为我们几乎一致! – whytheq