sql >> Databasteknik >  >> RDS >> Mysql

Genomsnitt av data för var 5:e minut under de givna tiderna

Gruppera till intervall

Du bör använda group by för att skapa en grupp för varje intervall som du vill göra ett genomsnitt över.

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

Detta utnyttjar det faktum att ett datum och en tid implicit kan konverteras till ett tal, som då kommer att ha formatet YYMMDDhhmmss . Att dividera ett sådant nummer med 100 tar bort sekunderna, och på liknande sätt dividera med 500 ger ett unikt nummer för varje 5-minutersintervall.

Den extra kolumnen jag valde kommer att ge mitten av intervallet:när som helst från intervallet (här väljer du minimum, men det spelar egentligen ingen roll), förvandlas till det 5-minutersintervallet, tillbaka till ett datum och tid antal och sedan lägga till två och en halv minut. Du kan använda liknande syntax för att beräkna början (lämna helt enkelt + 230 ut) eller (inklusive) slut (+ 459 ) av intervallet.

Testad med sqlfiddle .

Hantera slutintervall

Observera att din BETWEEN intervallet kommer att inkludera rader från 15:30:00 men inga andra från intervallet startade vid den tiden. Kanske vill du utesluta slutet av intervallet från ditt val:

where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'

Varför får du NULL

Om varför din fråga ger NULL :För att göra intervallräkning omsluter du inte hela intervallet inom citattecken, och du använder singularnamn för tidsenheter. Dvs

'2012-09-08 15:30:00' + INTERVAL 5 minute

Men detta skulle helt enkelt utöka intervallet till 2012-09-08 15:35:00 och ändå inte skapa de 5-minutersintervaller du vill ha. Som du skrev det försöker du lägga till två strängar, vilket inte är möjligt i MySQL om inte strängarna kan konverteras till siffror, i vilket fall dessa siffror kommer att läggas till.

Du kanske vill använda intervallaritmetik för att beräkna det exklusiva slutet av intervallet, dvs. den första sekunden efter intervallet:

 convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval

Lägg bara till 500 istället för 230 av min fråga kommer inte att fungera eftersom det resulterande talet kan representera ett ogiltigt datum för det sista intervallet av varje timme.




  1. Resurs-id #4 PHP MYSQL

  2. Villkorligt SQL-antal

  3. Flask-SQLAlchemy Gemener Index - hoppa över funktion, stöds inte av SQLAlchemy-reflektion

  4. Objektet i klassen Database kunde inte konverteras till sträng