2014-11-13 64 views
0

我第二次嘗試問這個問題,希望這個例子更簡單,我的問題更清晰...MySQL查詢選擇基於前N行值的行

我只是想查詢股票代碼最近的價格大於其之前的N行價格(按日期排序,但日期不連續)。對於這個例子,我們將設置N = 5,所以比較價格與前面5行的價格。

出來應該是符號,最近的日期,價格,價格n行前,日期n行前。

這裏是架構/數據的鏈接... http://sqlfiddle.com/#!2/bbb54/2

輸出應該是這樣的:

Symbol, Price,  Date, Price5RowAgo, Date5RowsAgo 
AA  16.37 2014-11-06  16.22 2014-10-11 
ADT  36.07 2014-11-05  35.19 2014-10-23 
AEO  13.82 2014-11-03  12.86 2014-10-07 

(注意,AFA不是結果,因爲它不符合條件)

如果讀取有關使用前一行值的許多問題/解決方案,但似乎無法使其中的任何一個適用於此特定情況。任何幫助和建議非常感謝!

回答

0

我能想到的最好的方法是使用子查詢來獲取前面的行。我試圖將它們作爲單個子查詢來使用,但是當您將它作爲選擇列添加時,它看起來像不能爲子查詢選擇多個列。也許有人可以將這兩者壓縮成一個。

SELECT *, 
    (SELECT p2.`DATE` FROM PRICES as p2 WHERE p2.`SYMBOL`=p1.`SYMBOL` ORDER BY p2.`DATE` LIMIT 5,1) as previousDate, 
    (SELECT p2.`PRICE` FROM PRICES as p2 WHERE p2.`SYMBOL`=p1.`SYMBOL` ORDER BY p2.`DATE` LIMIT 5,1) as previousPrice 
FROM PRICES as p1 GROUP BY p1.`SYMBOL`; 

顯然,需要回去所需行數的子查詢更改LIMIT 5,1

+0

謝謝你這...這讓我開始。我注意到,在2個子查詢中,我們需要將「DESC」添加到order-by子句以獲取正確的日期。您的查詢會獲得全部4個符號,而我需要的是將最近的價格與N天前的價格(本例中爲5)進行比較。 'HAVING PRICE> previousPrice'條款是否可以實現這一目標?我嘗試了sqlfiddle,但得到這個sql錯誤。 – Paul

+0

經過一番修補,我想我已經得到它... – Paul

+0

[code] SELECT *, (SELECT p2.'DATE' FROM PRICES as p2 WHERE p2.'SYMBOL' = p1.'SYMBOL' ORDER BY p2。 'DATE' DESC LIMIT 5,1)as previousDate, (SELECT p2.'PRICE' FROM PRICES as p2 WHERE p2.'SYMBOL' = p1.'SYMBOL' ORDER BY p2.'DATE' DESC LIMIT 5,1)as previousPrice FROM價格爲P1 GROUP BY p1.'SYMBOL' HAVING PRICE> PREVIOUSPRICE ORDER BY p1.SYMBOL ASC,p1.DATE DESC [代碼] – Paul

0

謝謝@huykir !!通過一些小的修改,現在可以完美地工作。這裏是最後的版本...

SELECT *, 
    (SELECT p2.`DATE` FROM PRICES as p2 WHERE p2.`SYMBOL`=p1.`SYMBOL` ORDER BY p2.`DATE` DESC LIMIT 5,1) as previousDate, 
    (SELECT p2.`PRICE` FROM PRICES as p2 WHERE p2.`SYMBOL`=p1.`SYMBOL` ORDER BY p2.`DATE` DESC LIMIT 5,1) as previousPrice 
FROM PRICES as p1 
GROUP BY p1.`SYMBOL` 
HAVING PRICE>PREVIOUSPRICE 
ORDER BY p1.SYMBOL ASC, p1.DATE DESC 
+0

視圖SQL撥弄溶液這裏: http://sqlfiddle.com/ #!2/bbb54/35 – Paul