Есть скрипт, который вызывается раз в минуту, собирает статистику с бирж и кладёт её в БД (MySQL). Нужно сделать выборку средних значений в каждый час от текущего момента. То есть, взять последние 60 записей и посчитать срднее от них, взять предпосление 60 записей и т.д. Как правильно сделать такую группировку по количеству да ещё и с конца?
Функциями работы с датой в самой СУБД - взять предыдущий час. Функциями агрегациив самой СУБД - взять среднее значение. Функциями группировкив самой СУБД - взять прошлый час, позапрошлый, позапозапрошлый и так далее сколько хочешь. Условными операторами в самой СУБД - ограничить результат выборки. А пых просто итерирует готовые значения.
Код (Text): create table test (vdate timestamp,rate int); insert into test (vdate,rate) values ('2017-12-01 10:00:00',10); insert into test (vdate,rate) values (NOW(),10); select sum(rate) from test where vdate >= NOW() - INTERVAL 24 HOUR;
@NightmareZ, есть ли поле с датой в записи, или только на количества ориентируетесь? И что делать с текущим часом... который ещё не прошел?
Есть поле stamp типа TIMESTAMP в который записывается NOW() при вставке. Не сильно важно, что делать с последним незавершённым часом. Можно взять просто последние 60 записей, можно сделать GROUP BY по HOUR(`stamp`) или как-то так. --- Добавлено --- Вобщем, спасибо, что нифига не помогли. Я сделал так. Код (Text): SELECT AVG(`BTC`), AVG(`LTC`), AVG(`XRP`), AVG(`BCH`), AVG(`ETH`) FROM ((SELECT * FROM `coins` WHERE `stamp` > DATE_SUB(NOW(), INTERVAL 1 DAY)) AS t) GROUP BY HOUR(`stamp`);
Для графика ты мог вычислять среднее прямо в графике. Не знаю как ты сделал в SQL, я бы сделал вычисляемое значение "час", вычисляемое из поля времени и группировал по нему. Типа Код (Text): SELECT (CONCAT(SUBSTR(time, 1, 13), ':00:00')) AS hour, avg(rate) AS rate FROM data GROUP BY 1