2014-11-24 32 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工作。