Групиране на интервали
Трябва да използвате group by
за да създадете една група за всеки интервал, за който искате да направите усредняване.
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
Това използва факта, че дата и час могат имплицитно да бъдат преобразувани в число, което след това ще бъде във формат YYMMDDhhmmss
. Разделянето на такова число на 100 отнема секундите и по подобен начин разделянето на 500 дава уникално число за всеки 5-минутен интервал.
Допълнителната колона, която избрах, ще даде средата на интервала:всеки момент от интервала (тук избирайки минимума, но няма значение), превърнат в този 5-минутно число на интервала, обратно в дата и час номер и след това добавяне на две минути и половина. Можете да използвате подобен синтаксис, за да изчислите началото (просто оставете + 230
изход) или (включително) край (+ 459
). ) на интервала.
Тествано с помощта на sqlfiddle .
Край на обработката на диапазон
Обърнете внимание, че вашият BETWEEN
диапазонът ще включва редове от 15:30:00
но никой друг от интервала не е започнал по това време. Може би искате да изключите края на диапазона от избора си:
where datetime >= '2012-09-08 00:00:00' AND datetime < '2012-09-08 15:30:00'
Защо получавате NULL
Относно защо вашата заявка дава NULL
:За да извършвате интервална аритметика, не ограждате целия интервал в кавички и използвате единствени имена за единици за време. т.е.
'2012-09-08 15:30:00' + INTERVAL 5 minute
Но това просто ще разшири диапазона до 2012-09-08 15:35:00
и все още не създавайте тези 5-минутни интервали, които искате. По начина, по който сте го написали, вие се опитвате да добавите два низа, което не е възможно в MySQL, освен ако низовете не могат да бъдат преобразувани в числа, в който случай тези числа ще бъдат добавени.
Може да искате да използвате интервална аритметика, за да изчислите изключителния край на интервала, т.е. първата секунда след интервалът:
convert((min(datetime) div 500)*500, datetime) + INTERVAL 5 minute as endOfInterval
Просто добавяне на 500
вместо 230
на моята заявка няма да работи, тъй като полученото число може да представлява невалидна дата за последния интервал от всеки час.