2014-11-13 63 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