PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Funzione di trigger SQL per AGGIORNARE la media mobile giornaliera su INSERT

Puoi fare un UPDATE FROM la tua query selezionata utilizzando i join appropriati nel tuo Trigger.

create or replace function update_sma8() RETURNS TRIGGER AS
$$
 BEGIN

UPDATE daily_ohlc d SET sma8 = s.simple_mov_avg 
FROM
(
 SELECT  sec.cdate,AVG(sec.close)  
   OVER(ORDER BY sec.cdate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) AS 
    simple_mov_avg FROM daily_ohlc sec
)s where s.cdate = NEW.cdate  --The newly inserted cdate
     AND d.cdate = s.cdate;   
RETURN NULL;

END $$ language plpgsql;

Demo

L'unico avvertimento sull'utilizzo di questo metodo è che se qualcuno elimina una riga o aggiornamenti close colonna, quindi i valori devono essere ricalcolati, cosa che non accadrà per le righe esistenti. Solo la riga inserita vedrà il valore ricalcolato corretto.

Invece, puoi semplicemente creare View per calcolare il sma8 colonna della tabella principale per tutte le righe quando richiesto.