Mysql
 sql >> Database >  >> RDS >> Mysql

Media dei dati per ogni 5 minuti nei tempi indicati

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.