【问题标题】:MySQL: "recursive" update rows. EMA ExampleMySQL:“递归”更新行。 EMA 示例
【发布时间】: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 ;

【问题讨论】:

    标签: mysql recursion


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 2018-12-17
      • 2020-06-20
      • 2022-11-03
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多