2

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

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

对于 EMA 计算(对于 10% 或 19 天 EMA),EMA(n) = 0.1 * price + 0.9 EMA(n-1) 所以,我们有一个递归方程,其中第 n 行的值取决于值行 (n -1)

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

任何只需要 order(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 ;
4

1 回答 1

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,一直持续到表的末尾。我不相信你能比你所拥有的更好。

于 2012-06-29T16:38:10.713 回答