2012-03-20 509 views
3

我想从MySQL列中计算12个月的移动平均数。数据表示时间序列功率测量,它是一个大数据集(几年内每10分钟一次)。高性能查询会很好,但速度是我以后可以研究的。计算SQL中的移动平均数

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

下面的查询给我的总活性每个月:

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

下面的查询给我的移动平均主动给定月份和年份 - 比如2011年10月

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

但是我想要生成一个查询,它返回下一列中的每月总数和12个月的移动平均数。

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

(6的因子是因为该数据表示每10分钟记录,瞬时功率,将总由6给出的总能量)

回答

5

尝试:

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)