2012-03-20 5 views
3

Je veux calculer une moyenne mobile de 12 mois à partir d'une colonne MySQL. Les données représentent des mesures de puissance de séries chronologiques, c'est un ensemble de données volumineux (toutes les 10 minutes pendant plusieurs années). Une requête de haute performance serait bien mais la vitesse est quelque chose que je peux travailler plus tard.Calculer des moyennes mobiles dans SQL

DTE     Active 
2012-1-3 00:10  500 
2012-1-3 00:20  520 
... etc 

La requête suivante me donne le total actif pour chaque mois:

SELECT YEAR(DTE) AS year, MONTH(DTE) AS month, SUM(Active)/6 as total FROM saturne s GROUP BY YEAR(DTE), MONTH(DTE) 

La requête suivante me donne la moyenne mobile active pour un mois donné et l'année - disent octobre 2011

SELECT SUM(Active)/6 AS average FROM saturne 
WHERE (YEAR(DTE) = 2011 AND MONTH(DTE) <= 10) OR (YEAR(DTE) = 2010 AND MONTH(DTE) > 10) 

Je voudrais cependant générer une requête qui renvoie le total mensuel et la moyenne mobile de 12 mois dans la colonne suivante.

year  month  total  average 
2012  2   701474  9258089 
2012  1   877535  9386664 
... etc 

(Le facteur 6 est parce que les données représentent la puissance instantanée enregistrée toutes les 10 minutes, en divisant le total par 6 donne l'énergie totale)

Répondre

5

Essayer:

SELECT YEAR(GDTE) AS year, 
     MONTH(GDTE) AS month, 
     SUM(case when i=0 then Active end)/6 as total, 
     SUM(Active)/(MAX(i+1)*6) as avg 
FROM 
(select s.*, DATE_ADD(DTE, INTERVAL m.i MONTH) GDTE, m.i 
FROM saturne s 
cross join (select 0 i union select 1 union select 2 union select 3 union 
      select 4 union select 5 union select 6 union select 7 union 
      select 8 union select 9 union select 10 union select 11) m 
) sq 
WHERE GDTE <= curdate() 
GROUP BY YEAR(GDTE), MONTH(GDTE) 
Questions connexes