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.