2016-12-28 101 views
1

下表接收數據集(近)通過的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個條目。

我想計算過去X小時的userCount列的每小時平均值。

有沒有人有想法?

P.S:如果沒有辦法通過SQL做到這一點,我想通過PHP

+0

你爲什麼要保存唯一時間戳旁邊一個日期時間? – e4c5

+0

1.因爲我可以......併爲了調試目的......並給你可能計算的可能性 – Ch3rm

+0

因爲它是一個窄列它並不重要,但通常在SQL中我們不存儲值可以生成。我們使用生成的列 – e4c5

回答

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) 
+0

完美。正是我需要的。謝謝! – Ch3rm

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

不幸的是,MySQL中沒有DATEPART函數。 – Ch3rm

+0

您可以試試這個: 'SELECT EXTRACT(DAY_HOUR,human_time)AS hour,COUNT(id)id FROM table WHERE human_time> ='2016-12-21'AND human_time <'2016-12-21' GROUP BY EXTRACT(DAY_HOUR,human_time);' –

0

(PHP SOLUTION) 由於UNIX時間戳是在幾秒鐘內,你可以計算出2枚郵票之間的差異以小時這樣的:

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

您可以同時迭代時間戳和userCount列,並檢查: 如果timestamps diff是(或大於)我想要的小時範圍,我將計算得到的userCount的總和(將每個添加到var $ sum),並將其除以第一個時間戳ID列和最後一個時間戳ID列之間的差異。

希望它有幫助,祝你好運! :)

相關問題