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

Gennemsnit af data for hvert 5. minut på de givne tidspunkter

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.




  1. Sådan slår du MySQL strict mode fra i Rails

  2. Opret en ny Oracle-bruger og giv privilegier:Syntaks og eksempler

  3. MySQL blander Damerau–Levenshtein Fuzzy med Like Wildcard

  4. AWS RDS:"SQLSTATE[22001] - Data for lange til kolonne" ved hjælp af MariaDB 10.2