Рассчитать скользящие средние в SQL - PullRequest
3 голосов
/ 20 марта 2012

Я хочу рассчитать скользящее среднее за 12 месяцев из столбца MySQL.Данные представляют измерения мощности временных рядов, это большой набор данных (каждые 10 минут в течение нескольких лет).Высокопроизводительный запрос был бы хорош, но со скоростью я могу справиться позже.

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)

Следующий запросдает мне скользящее среднее значение Active за данный месяц и год - скажем, октябрь 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 дает общую энергию)

1 Ответ

5 голосов
/ 20 марта 2012

Попробуйте:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...