2012-03-20 3 views
3

Я хочу рассчитать скользящую среднюю 12 месяцев из столбца MySQL. Данные представляют измерения мощности во временном ряду, это довольно большой набор данных (каждые 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

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) 
Смежные вопросы