MySQL查询根据第N行的第N行的值选择行

时间:2014-11-13 20:40:25

标签: mysql row relative lag

我第二次尝试提出这个问题,希望这个例子更简单,我的问题更清楚......

我只想查询最近价格大于其前一行的价格的股票代码(按日期排序,但日期不是连续的)。对于此示例,我们设置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不符合标准,因为它不符合标准)

如果阅读有关使用前一行中的值的许多问题/解决方案,但似乎无法使其中任何一个适应这种特定情况。任何帮助和建议都非常感谢!

2 个答案:

答案 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