2009-12-10 29 views
7

基本上我希望根據時間跨度彙總表中的某些值。按MySQL中的時間段彙總數據

我所做的是,我每15分鐘拍攝一次系統快照,並希望能夠長時間繪製一些圖形。由於如果顯示的點數太多(除了渲染速度非常慢),圖形會變得非常混亂,因此我希望通過對多個點進行平均,將多個點聚合爲一個點,從而減少點數。

爲此,我必須能夠通過我可以定義的桶(每天,每週,每月,每年......)進行分組,但到目前爲止,我的所有實驗都沒有運氣。

我可以申請這樣做嗎?

回答

10

我有一個類似的問題:collating-stats-into-time-chunks並得到了很好的回答。本質上,答案是:

也許你可以使用DATE_FORMAT()函數和分組。這裏有一個例子,希望你能適應你的確切需求。

SELECT 
    DATE_FORMAT(time, "%H:%i"), 
    SUM(bytesIn), 
    SUM(bytesOut) 
FROM 
    stats 
WHERE 
    time BETWEEN <start> AND <end> 
GROUP BY 
    DATE_FORMAT(time, "%H:%i") 

如果你的時間窗口覆蓋超過一天,你使用的示例格式,從不同天的數據將被彙總到「小時的天」桶。如果原始數據不完全落在小時,則可以使用「%H:00」將其平滑化。

非常感謝martin clayton爲我提供的答案。

+0

這是否規模有多大?我的問題是,這將在一年後產生數百萬條記錄。 – cdecker 2009-12-11 16:42:08

+1

我看不出爲什麼它不會。很明顯,做任何類型的時間轉換都很慢,但大部分時間都會花費在數據本身的聚合上,這對您來說是不可避免的。 – cmroanirgo 2009-12-16 23:57:15

2

可以很容易地截斷次,最後15分鐘(例如),通過執​​行類似:

SELECT dateadd(minute, datediff(minute, '20000101', yourDateTimeField)/15 * 15, '20000101') AS the15minuteBlock, COUNT(*) as Cnt 
FROM yourTable 
GROUP BY dateadd(minute, datediff(minute, '20000101', yourDateTimeField)/15 * 15, '20000101'); 

使用類似截斷方法按小時,周,等等。

你總是可以包起來的CASE語句來處理多種方法,使用:

GROUP BY CASE @option WHEN 'week' THEN dateadd(week, .....