Как получить среднечасовое значение, которое хранится в минуту

Следующая таблица получает набор данных (почти) каждую минуту через 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

1

Решение

Вам просто нужно извлечь дату и время из времени. Я бы придерживался человеческого времени:

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)
1

Другие решения

(РЕШЕНИЕ PHP)
Поскольку временная метка unix указана в секундах, вы можете рассчитать разницу между двумя отметками в часах следующим образом:

$stamp1 = 1482310381;
$stamp2 = 1482310202;
$hours_diff = ($stamp1 - $stamp2) / 60 / 60;

Вы можете перебирать столбцы timestamp и userCount одновременно и проверять:
если разность меток времени (или больше) часового диапазона, который я хочу, я вычислю сумму полученной суммы userCount (добавьте каждую к переменной, т.е. $ sum) и разделю ее на разность между первым столбцом идентификатора метки времени и последний столбец идентификатора метки времени.

Надеюсь, это поможет, удачи! 🙂

0

Ты можешь использовать 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)
0
По вопросам рекламы [email protected]