Raggruppa a intervalli
Dovresti usare group by
per creare un gruppo per ogni intervallo di cui vuoi fare la media.
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
Ciò sfrutta il fatto che una data e un'ora possono essere implicitamente convertite in un numero, che sarà quindi del formato YYMMDDhhmmss
. Dividendo un tale numero per 100 si spogliano i secondi e allo stesso modo dividendo per 500 si ottiene un numero univoco per ogni intervallo di 5 minuti.
La colonna aggiuntiva che ho selezionato darà la metà dell'intervallo:qualsiasi momento dall'intervallo (qui scegliendo il minimo, ma non importa), trasformato in quel numero di intervallo di 5 minuti, di nuovo in una data e ora numero, e poi aggiungendo due minuti e mezzo. Potresti usare una sintassi simile per calcolare l'inizio (lascia semplicemente il + 230
out) o (incluso) end (+ 459
) dell'intervallo.
Testato utilizzando sqlfiddle .
Gestione di fine intervallo
Nota che il tuo BETWEEN
l'intervallo includerà le righe da 15:30:00
ma nessun altro dell'intervallo è iniziato in quel momento. Forse vuoi escludere la fine dell'intervallo dalla tua selezione:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Perché diventi NULL
Sul motivo per cui la tua query restituisce NULL
:Per eseguire l'aritmetica degli intervalli, non racchiudere l'intero intervallo tra virgolette e utilizzare nomi singolari per le unità di tempo. Cioè
'2012-09-08 15:30:00' + INTERVAL 5 minute
Ma questo estenderebbe semplicemente l'intervallo a 2012-09-08 15:35:00
e ancora non creare quegli intervalli di 5 minuti che desideri. Nel modo in cui l'hai scritto, stai cercando di aggiungere due stringhe, cosa che non è possibile in MySQL a meno che le stringhe non possano essere convertite in numeri, nel qual caso quei numeri verranno aggiunti.
Potresti voler utilizzare l'aritmetica degli intervalli per calcolare la fine esclusiva dell'intervallo, ovvero il primo secondo dopo l'intervallo:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Semplicemente aggiungendo 500
invece del 230
della mia query non funzionerà in quanto il numero risultante potrebbe rappresentare una data non valida per l'ultimo intervallo di ogni ora.