PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonction de déclenchement SQL pour mettre à jour la moyenne mobile quotidienne lors de l'insertion

Vous pouvez faire une UPDATE FROM votre requête de sélection en utilisant les jointures appropriées dans votre déclencheur.

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;

Démo

La seule mise en garde concernant l'utilisation de cette méthode est que si quelqu'un supprime une ligne ou des mises à jour close colonne, les valeurs doivent être recalculées, ce qui n'arrivera pas pour les lignes existantes. Seule la ligne insérée verra la bonne valeur recalculée.

Au lieu de cela, vous pouvez simplement créer View pour calculer le sma8 colonne de la table principale pour toutes les lignes sur demande.