我第二次尝试提出这个问题,希望这个例子更简单,我的问题更清楚......
我只想查询最近价格大于其前一行的价格的股票代码(按日期排序,但日期不是连续的)。对于此示例,我们设置N = 5,因此将价格与之前5行的价格进行比较。
输出应该是符号,最近的日期,价格,价格-n-rows-ago,date-n-rows-ago。
这是架构/数据的链接...... 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 :(得分: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
以返回所需的行数。
答案 1 :(得分: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