Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Durchschnitt der Daten für alle 5 Minuten in den angegebenen Zeiten

In Intervalle gruppieren

Sie sollten group by verwenden um eine Gruppe für jedes Intervall zu erstellen, über das Sie den Durchschnitt berechnen möchten.

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

Dabei wird ausgenutzt, dass ein Datum und eine Uhrzeit implizit in eine Zahl umgewandelt werden können, die dann das Format YYMMDDhhmmss hat . Wenn Sie eine solche Zahl durch 100 teilen, werden die Sekunden entfernt, und in ähnlicher Weise ergibt eine Division durch 500 eine eindeutige Zahl für jedes 5-Minuten-Intervall.

Die zusätzliche Spalte, die ich ausgewählt habe, gibt die Mitte des Intervalls an:jede Zeit aus dem Intervall (hier das Minimum wählen, aber es spielt keine Rolle), umgewandelt in diese 5-Minuten-Intervallnummer, zurück in ein Datum und eine Uhrzeit Zahl und addieren dann zweieinhalb Minuten. Sie können eine ähnliche Syntax verwenden, um den Anfang zu berechnen (lassen Sie einfach + 230 out) oder (inklusive) end (+ 459 ) des Intervalls.

Getestet mit sqlfiddle .

Handhabung am Ende des Bereichs

Beachten Sie, dass Ihr BETWEEN Der Bereich enthält Zeilen ab 15:30:00 aber keine anderen aus dem Intervall begannen zu dieser Zeit. Vielleicht möchten Sie das Ende des Bereichs von Ihrer Auswahl ausschließen:

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

Warum Sie NULL erhalten

Warum Ihre Abfrage NULL ergibt :Um Intervallarithmetik durchzuführen, schließen Sie nicht das ganze Intervall-Ding in Anführungszeichen ein und verwenden Singularnamen für Zeiteinheiten. D.h.

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

Aber das würde den Bereich einfach auf 2012-09-08 15:35:00 erweitern und immer noch nicht die gewünschten 5-Minuten-Intervalle erstellen. So wie Sie es geschrieben haben, versuchen Sie, zwei Strings hinzuzufügen, was in MySQL nicht möglich ist, es sei denn, die Strings können in Zahlen umgewandelt werden, in diesem Fall werden diese Zahlen hinzugefügt.

Möglicherweise möchten Sie die Intervallarithmetik verwenden, um das exklusive Ende des Intervalls zu berechnen, d. h. die erste Sekunde nach das Intervall:

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

Einfach 500 hinzufügen statt 230 meiner Abfrage funktioniert nicht, da die resultierende Zahl möglicherweise ein ungültiges Datum für das letzte Intervall jeder Stunde darstellt.