在MySQL上模拟滞后函数

时间:2014-11-24 14:25:27

标签: mysql

我正试图从下表中得到滞后值(当前行 - 最后一行):

+-------+------------+-------------+---------------------+
| index | codigowine | preconormal | timestamp           |
+-------+------------+-------------+---------------------+
|     2 | 10088      |       65.60 | 2014-11-18 23:39:08 |
|  1005 | 10088      |       62.60 | 2014-11-20 11:00:14 |
|  2028 | 10088      |       62.60 | 2014-11-21 09:00:13 |
|  3092 | 10088      |       62.60 | 2014-11-22 09:00:12 |
|  5083 | 10088      |       69.00 | 2014-11-24 09:00:13 |
+-------+------------+-------------+---------------------+

预期输出应为:

+-------+------------+-------------+---------------------+-----------+
| index | codigowine | preconormal | timestamp           | lag_price |
+-------+------------+-------------+---------------------+-----------+
|     2 | 10088      |       65.60 | 2014-11-18 23:39:08 |      0.00 |
|  1005 | 10088      |       62.60 | 2014-11-20 11:00:14 |     -3.00 |
|  2028 | 10088      |       62.60 | 2014-11-21 09:00:13 |      0.00 |
|  3092 | 10088      |       62.60 | 2014-11-22 09:00:12 |      0.00 |
|  5083 | 10088      |       69.00 | 2014-11-24 09:00:13 |      6.40 |
+-------+------------+-------------+---------------------+-----------+

我已经看到一些通过设置变量和计算行之间的差异来模拟MySQL上的滞后函数的示例,但我无法让它工作:

SET @price=0;
select index,codigowine,@price price_lag, @price:=preconormal curr_price from precos order by codigowine, timestamp;

这是SQL fiddle

其他可能性是使用php计算或添加新表并通过python进行编程,但如果我能够通过SQL执行此操作,我正试图避免这些可能性。

1 个答案:

答案 0 :(得分:0)

好的,经过一些挖掘,以及@Marc B的建议,我终于到了我想要的地方。如果其他人需要帮助,这是我的答案:

set @price = (select preconormal from precos where codigowine='10088' order by timestamp asc limit 1);

在上面的一行中,我将@price设置为第一条记录而不是零,以避免第一行的lag_price为65.60。

以下是实际结果:

select codigowine, preconormal - @price as lag_price, @price:=preconormal curr_price from precos WHERE codigowine='10088' order by timestamp;

这是the fiddle工作。