Grupuj w interwały
Powinieneś użyć group by
aby utworzyć jedną grupę dla każdego przedziału, w którym chcesz uśredniać.
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
Wykorzystuje to fakt, że datę i godzinę można domyślnie przekonwertować na liczbę, która będzie miała format YYMMDDhhmmss
. Dzielenie takiej liczby przez 100 oznacza sekundy i analogicznie dzielenie przez 500 daje unikalną liczbę na każdy 5-minutowy interwał.
Dodatkowa kolumna, którą wybrałem, poda środek interwału:dowolny czas z interwału (tutaj wybieram minimum, ale to nie ma znaczenia), zamieniony na tę 5-minutową liczbę interwału, z powrotem na datę i godzinę numer, a następnie dodając dwie i pół minuty. Możesz użyć podobnej składni do obliczenia początku (po prostu pozostaw + 230
out) lub (włącznie) koniec (+ 459
) przedziału.
Testowane przy użyciu sqlfiddle .
Obsługa końca zakresu
Zwróć uwagę, że Twój BETWEEN
zakres będzie zawierał wiersze od 15:30:00
ale żadne inne z tego okresu nie rozpoczęły się w tym czasie. Może chcesz wykluczyć koniec zakresu z wyboru:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Dlaczego otrzymujesz NULL
Dlaczego Twoje zapytanie zwraca NULL
:Aby wykonać arytmetykę interwałową, nie umieszczaj całego interwału w cudzysłowie i używaj pojedynczych nazw dla jednostek czasu. To znaczy
'2012-09-08 15:30:00' + INTERVAL 5 minute
Ale to po prostu rozszerzyłoby zakres do 2012-09-08 15:35:00
i nadal nie twórz tych 5-minutowych interwałów, które chcesz. Sposób, w jaki to napisałeś, oznacza, że próbujesz dodać dwa ciągi, co nie jest możliwe w MySQL, chyba że ciągi można przekonwertować na liczby, w którym to przypadku liczby te zostaną dodane.
Możesz użyć arytmetyki przedziałów, aby obliczyć wyłączny koniec przedziału, tj. pierwszą sekundę po przedział:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Wystarczy dodać 500
zamiast 230
mojego zapytania nie zadziała, ponieważ wynikowa liczba może reprezentować nieprawidłową datę dla ostatniego interwału każdej godziny.