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

Moyenne des données toutes les 5 minutes dans les temps donnés

Regrouper en intervalles

Vous devez utiliser group by pour créer un groupe pour chaque intervalle sur lequel vous souhaitez calculer la moyenne.

select avg(Column), convert((min(datetime) div 500)*500 + 230, datetime) as time
from Databasename.tablename 
where datetime BETWEEN '2012-09-08 00:00:00' AND '2012-09-08 15:30:00'
group by datetime div 500

Cela utilise le fait qu'une date et une heure peuvent implicitement être converties en un nombre, qui sera alors au format YYMMDDhhmmss . La division d'un tel nombre par 100 supprime les secondes et, de la même manière, la division par 500 donne un nombre unique pour chaque intervalle de 5 minutes.

La colonne supplémentaire que j'ai sélectionnée donnera le milieu de l'intervalle :à tout moment de l'intervalle (ici en choisissant le minimum, mais cela n'a pas vraiment d'importance), transformé en ce numéro d'intervalle de 5 minutes, de nouveau en une date et une heure nombre, puis en ajoutant deux minutes et demie. Vous pouvez utiliser une syntaxe similaire pour calculer le début (laissez simplement le + 230 out) ou (inclusif) end (+ 459 ) de l'intervalle.

Testé avec sqlfiddle .

Traitement de fin de gamme

Notez que votre BETWEEN la plage inclura les lignes à partir de 15:30:00 mais aucun autre de l'intervalle n'a commencé à ce moment-là. Vous souhaitez peut-être exclure la fin de la plage de votre sélection :

where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

Pourquoi vous obtenez NULL

Pourquoi votre requête renvoie NULL :Pour faire de l'arithmétique d'intervalle, vous ne mettez pas tout l'intervalle entre guillemets et vous utilisez des noms singuliers pour les unités de temps. C'est-à-dire

'2012-09-08 15:30:00' + INTERVAL 5 minute

Mais cela étendrait simplement la plage à 2012-09-08 15:35:00 et ne créez toujours pas les intervalles de 5 minutes que vous souhaitez. La façon dont vous l'avez écrit, vous essayez d'ajouter deux chaînes, ce qui n'est pas possible dans MySQL à moins que les chaînes puissent être converties en nombres, auquel cas ces nombres seront ajoutés.

Vous voudrez peut-être utiliser l'arithmétique d'intervalle pour calculer la fin exclusive de l'intervalle, c'est-à-dire la première seconde après l'intervalle :

 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

Ajouter simplement 500 au lieu du 230 de ma requête ne fonctionnera pas car le nombre résultant peut représenter une date non valide pour le dernier intervalle de chaque heure.