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.