【发布时间】:2012-06-29 16:01:54
【问题描述】:
一般问题是如何更新第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 列?现在,我只能在循环中进行顺序更新。我的丑陋解决方案在这里列出。它需要 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 ;
【问题讨论】: