Vielleicht könnte mir jemand helfen. Ich möchte den EMA über die USD-Werte der letzten 31 Tage einer MySQL-Tabelle berechnen. An sich funktioniert es auch ganz gut, aber Metabase zeigt einfach nur eine gerade Linie mit dem Durchschnittswert an. Außerdem ist es nicht gerade performant. Ich vermute, die Komplexität beträgt schon n*n nur für eine Anfrage. Spielen dabei möglicherweise Anfragetimeouts oder die Limits eine Rolle?
Hier ist mein Script:
Aber Metabase zeigt einfach nur einen festen Durchschnittswert an: (hier als hellblau zu sehen)
Hier ist mein Script:
SQL:
drop function if exists Calc_EMA_1;
DELIMITER $$
create function Calc_EMA_1(p_datum datetime, alpha decimal)
RETURNS decimal(12,2)
DETERMINISTIC
begin
DECLARE ema decimal;
DECLARE state decimal DEFAULT null;
DECLARE inval decimal;
DECLARE cursor_List_isdone BOOLEAN DEFAULT FALSE;
DECLARE cursor_List CURSOR FOR
SELECT usd
FROM book1
WHERE typ = 'b' AND NOT is_old
AND datum <= p_datum
ORDER BY datum ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET cursor_List_isdone = TRUE;
OPEN cursor_List;
loop_List: LOOP
FETCH cursor_List INTO inval;
IF cursor_List_isdone THEN
LEAVE loop_List;
END IF;
if state is null then
set ema = inval;
else
set ema = alpha * inval + (1-alpha) * state;
end if;
set state = inval;
END LOOP loop_List;
CLOSE cursor_List;
return ema;
end $$
DELIMITER ;
SELECT * FROM information_schema.routines;
drop view if exists book1_31d_ema;
create view book1_31d_ema as
select *, Calc_EMA_1(datum, 0.5) as usd_ema from book1 where typ = 'b' and is_old = 0 and datum >= current_timestamp() - interval 31 day order by datum desc;
SELECT * FROM book1_31d_ema LIMIT 50;
Aber Metabase zeigt einfach nur einen festen Durchschnittswert an: (hier als hellblau zu sehen)