2014-11-24 34 views
0

我试图让滞后值(当前行 - 最后一行)模拟滞后函数从下表:在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来执行此操作。

+2

在执行'@price:='更新之前,只需将'preconormal - @price as lag_price'放入字段列表中。 MySQL处理左侧和右侧的变量和变量赋值 – 2014-11-24 14:27:45

回答

0

好吧,等一些更多的挖掘,以及@Marc B的建议,我终于到了我想要的地方。如果别人需要帮助,这是我的答案:

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

在线以上我设置@price第一条记录,而不是零,以避免第一行上获得的65.60一lag_price。

下面是实际结果:

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

这里的the fiddle工作。