2013-07-16 60 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