Следующая таблица получает набор данных (почти) каждую минуту через cronjob:
id | timestamp | humanTime | userCount
-----------------------------------------------------
1 1482310202 2016-12-21 09:50:07 120
2 1482310262 2016-12-21 09:51:07 126
3 1482310322 2016-12-21 09:52:06 110
4 1482310381 2016-12-21 09:54:06 131
5 ...
Поскольку cronjob — это запрос через сеть, не гарантируется, что в каждый час будет 60 записей из-за возможных таймаутов.
Я хотел бы рассчитать среднечасовое значение столбца userCount за последние X часов.
У кого-нибудь есть идея?
П.С .: Если нет способа сделать это через SQL, я бы хотел решить эту проблему с помощью PHP
Вам просто нужно извлечь дату и время из времени. Я бы придерживался человеческого времени:
select date(humanTime) as dd, hour(humanTime) as hh, avg(userCount)
from t
group by date(humanTime), hour(humanTime)
order by dd, hh;
Если вы хотите последние «n» часов, то включите:
where humanTime >= date_sub(now(), interval "n" hour)
(РЕШЕНИЕ PHP)
Поскольку временная метка unix указана в секундах, вы можете рассчитать разницу между двумя отметками в часах следующим образом:
$stamp1 = 1482310381;
$stamp2 = 1482310202;
$hours_diff = ($stamp1 - $stamp2) / 60 / 60;
Вы можете перебирать столбцы timestamp и userCount одновременно и проверять:
если разность меток времени (или больше) часового диапазона, который я хочу, я вычислю сумму полученной суммы userCount (добавьте каждую к переменной, т.е. $ sum) и разделю ее на разность между первым столбцом идентификатора метки времени и последний столбец идентификатора метки времени.
Надеюсь, это поможет, удачи! 🙂
Ты можешь использовать DATEPART
, Как здесь, я предоставляю счет за час на один день:
SELECT DATEPART(hh, human_time) AS hour, COUNT(id) id
FROM table
WHERE human_time >= '2016-12-21' AND human_time < '2016-12-21'
GROUP BY DATEPART(hh, human_time)