一般问题是如何更新第 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 ;