sql >> Database >  >> RDS >> Mysql

Gemiddelde van gegevens voor elke 5 minuten in de opgegeven tijden

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.




  1. Geautomatiseerde manier om XML-bestanden naar SQL-database te converteren?

  2. Hoe datagrid in WPF te vernieuwen

  3. Postgresql repareren na upgrade naar OSX 10.7 Lion

  4. Het compatibiliteitsniveau van een database wijzigen met T-SQL