Groep naar intervallen
Gebruik group by
om één groep te maken voor elk interval waarover u het gemiddelde wilt nemen.
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
Hierbij wordt gebruik gemaakt van het feit dat een datum en tijd impliciet kunnen worden omgezet in een getal, dat dan het formaat YYMMDDhhmmss
heeft. . Door zo'n getal te delen door 100 worden de seconden gestript, en op dezelfde manier delen door 500 levert een uniek getal op voor elk interval van 5 minuten.
De extra kolom die ik heb geselecteerd, geeft het midden van het interval weer:elk moment van het interval (hier het minimum kiezen, maar het maakt niet echt uit), omgezet in dat intervalnummer van 5 minuten, terug in een datum en tijd nummer, en vervolgens twee en een halve minuut toe te voegen. U kunt een vergelijkbare syntaxis gebruiken om het begin te berekenen (laat gewoon de + 230
uit) of (inclusief) einde (+ 459
) van het interval.
Getest met sqlfiddle .
Afhandeling einde bereik
Houd er rekening mee dat uw BETWEEN
bereik bevat rijen van 15:30:00
maar geen anderen uit de pauze begonnen op dat moment. Misschien wilt u het einde van het bereik uit uw selectie uitsluiten:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Waarom krijg je NULL
Waarom uw zoekopdracht NULL
oplevert? :Om intervalberekeningen uit te voeren, plaatst u niet het hele interval tussen aanhalingstekens en gebruikt u enkelvoudige namen voor tijdseenheden. D.w.z.
'2012-09-08 15:30:00' + INTERVAL 5 minute
Maar dit zou het bereik eenvoudig uitbreiden tot 2012-09-08 15:35:00
en maak nog steeds niet die intervallen van 5 minuten die u wilt. Zoals je het schreef, probeer je twee strings toe te voegen, wat niet mogelijk is in MySQL, tenzij de strings kunnen worden geconverteerd naar getallen, in welk geval die getallen worden toegevoegd.
Misschien wilt u intervalberekeningen gebruiken om het exclusieve einde van het interval te berekenen, d.w.z. de eerste seconde na het interval:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Gewoon 500
toevoegen in plaats van de 230
van mijn zoekopdracht werkt niet, omdat het resulterende getal een ongeldige datum kan vertegenwoordigen voor het laatste interval van elk uur.