2012-06-29 50 views
1

一般问题是如何更新第n行上的column_A,该行取决于第n-1行上的column_A。MySQL:“递归”更新行。 EMA示例

具体的问题是计算和持久EMA(指数移动平均)是一个MYSQL表。 EMA(n)= 0.1 *价格+ 0.9 EMA(n-1) 因此,我们有一个递归方程,其中第n行的值取决于值行(n-1)

在任何编程语言中,这都很容易计算。
但是,如果EMA作为列存储在MYSQL表中。如何在MYSQL脚本中有效地计算和更新EMA列?现在,我只能在循环中进行顺序更新。我的丑陋解决方案列在这里。它需要订单(n)更新。

任何聪明的想法,只需要订单(1)更新?

非常感谢您


DELIMITER $$ 

DROP PROCEDURE IF EXISTS update_ema$$ 

CREATE PROCEDURE update_ema(
IN series_id INT 
) 
BEGIN 

DECLARE counter INT; 

SET counter = 2; 

WHILE counter <= 5000 DO 

    update price_table as x 
    inner join price_table y 
    on x.id = y.id and x.row_num = y.row_num+1 
    and x.Id=series_id and x.row_num = counter 
    set x.EMA19 = func_ema(19, y.EMA19, x.price); 

SET counter = counter + 1; 


END WHILE; 
END$$ 
DELIMITER ; 

回答

0

如果column_a的价值,行(N)取决于column_a的价值,行(N-1),然后改变它会改变值所有以下行:

(不是代码)

if 

x = row number 
row(x) col(a) = f(row(x-1) col(a)) 


then 

where x = n 
row(n) col(a) = f(row(n-1) col(a)) 

where x = n + 1 
row((n+1)) col(a) = f(row((n+1)-1) col(a)) 
row(n+1) col(a) = f(row(n) col(a)) 

当你改变N,你必须更新N + 1,这一直持续到电子桌子旁边。我不相信你能比你拥有的更好。