MySQL:“递归”更新行。 EMA示例

时间:2012-06-29 16:01:54

标签: mysql recursion

一般问题是如何更新第n行的column_A,这取决于第n-1行的column_A。

具体问题是计算和持久性EMA(指数移动平均线)是一个MYSQL表。

用于EMA计算(10%或19天EMA),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 ;

1 个答案:

答案 0 :(得分:0)

如果column_a,row(n)的值取决于column_a,row(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,这将一直持续到表的末尾。我不相信你能比你拥有的更好。