Seskupit do intervalů
Měli byste použít group by
pro vytvoření jedné skupiny pro každý interval, za který chcete vytvořit průměr.
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
To využívá skutečnosti, že datum a čas lze implicitně převést na číslo, které pak bude ve formátu YYMMDDhhmmss
. Vydělením takového čísla 100 se odeberou sekundy a podobně dělením 500 získá jedinečné číslo pro každý 5minutový interval.
Dodatečný sloupec, který jsem vybral, bude uvádět střed intervalu:jakýkoli čas z intervalu (zde volíte minimum, ale na tom nezáleží), přeměněn na toto 5minutové číslo intervalu, zpět na datum a čas číslo a poté přidejte dvě a půl minuty. Pro výpočet začátku můžete použít podobnou syntaxi (stačí ponechat + 230
out) nebo (včetně) konec (+ 459
) intervalu.
Testováno pomocí sqlfiddle .
Zpracování konce rozsahu
Všimněte si, že vaše BETWEEN
rozsah bude zahrnovat řádky od 15:30:00
ale žádný jiný z intervalu v té době nezačal. Možná budete chtít z výběru vyloučit konec rozsahu:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Proč máte hodnotu NULL
Proč váš dotaz dává NULL
:Chcete-li provádět intervalovou aritmetiku, neuzavíráte celý interval do uvozovek a pro časové jednotky používáte singulární názvy. T.j.
'2012-09-08 15:30:00' + INTERVAL 5 minute
Ale to by jednoduše rozšířilo rozsah na 2012-09-08 15:35:00
a přesto nevytvářejte požadované 5minutové intervaly. Jak jste to napsali, pokoušíte se přidat dva řetězce, což v MySQL není možné, pokud řetězce nelze převést na čísla, v takovém případě budou tato čísla přidána.
Možná budete chtít použít intervalovou aritmetiku k výpočtu výhradního konce intervalu, tj. první sekundy po interval:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Stačí přidat 500
místo 230
mého dotazu nebude fungovat, protože výsledné číslo může představovat neplatné datum pro poslední interval každé hodiny.