Grupper til intervaller
Du bør bruge group by
for at oprette en gruppe for hvert interval, som du vil lægge et gennemsnit over.
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
Dette gør brug af, at en dato og et klokkeslæt implicit kan konverteres til et tal, som så vil have formatet YYMMDDhhmmss
. At dividere et sådant tal med 100 fjerner sekunderne og på samme måde dividere med 500 giver et unikt tal for hvert 5-minutters interval.
Den ekstra kolonne, jeg valgte, vil give midten af intervallet:når som helst fra intervallet (her vælges minimum, men det betyder ikke rigtig noget), omdannet til det 5-minutters intervalnummer, tilbage til en dato-og-tid nummer, og derefter tilføje to et halvt minut. Du kan bruge lignende syntaks til at beregne begyndelsen (bare lad + 230
ud) eller (inklusive) ende (+ 459
) af intervallet.
Testet med sqlfiddle .
Håndtering af slutområde
Bemærk, at din BETWEEN
interval vil omfatte rækker fra 15:30:00
men ingen andre fra intervallet startede på det tidspunkt. Måske vil du udelukke slutningen af intervallet fra dit valg:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Hvorfor får du NULL
Hvorfor din forespørgsel giver NULL
:For at lave intervalregning skal du ikke sætte hele interval-tinget i anførselstegn, og du bruger entalsnavne til tidsenheder. Dvs.
'2012-09-08 15:30:00' + INTERVAL 5 minute
Men dette ville blot udvide intervallet til 2012-09-08 15:35:00
og stadig ikke oprette de 5-minutters intervaller, du ønsker. Som du skrev det, forsøger du at tilføje to strenge, hvilket ikke er muligt i MySQL, medmindre strengene kan konverteres til tal, i hvilket tilfælde disse tal vil blive tilføjet.
Du vil måske bruge intervalaritmetik til at beregne den eksklusive slutning af intervallet, dvs. det første sekund efter intervallet:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Du skal blot tilføje 500
i stedet for 230
af min forespørgsel vil ikke fungere, da det resulterende tal muligvis repræsenterer en ugyldig dato for det sidste interval af hver time.