Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Średnia danych z każdych 5 minut w podanych czasach

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie aplikacji internetowej od podstaw przy użyciu Python Flask i MySQL:część 2

  2. Jak sprawdzić, czy przycisk radiowy jest zaznaczony lub zaznaczony w jQuery?

  3. aktualizowanie wierszy zamiast tworzenia nowej bazy danych wpisów android

  4. Bardzo trwały /opt/lampp/bin/mysql.server:264:kill:Brak takiego procesu. Xamp/ubuntu 16.04

  5. Zapytanie MySQL przy użyciu tablicy