2012-06-29 88 views
1

一般問題是如何更新第n行上的column_A,該行取決於第n-1行上的column_A。MySQL:「遞歸」更新行。 EMA示例

具體的問題是計算和持久EMA(指數移動平均)是一個MYSQL表。 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 ; 

回答

0

如果column_a的價值,行(N)取決於column_a的價值,行(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,這一直持續到電子桌子旁邊。我不相信你能比你擁有的更好。