我正试图从下表中得到滞后值(当前行 - 最后一行):
+-------+------------+-------------+---------------------+
| 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执行此操作,我正试图避免这些可能性。
答案 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工作。