2011-06-23 70 views
4

我有一個MySQL數據庫,用於存儲功率讀數,每分鐘添加一次讀數。 (即每天1,440個讀數)。SQL查詢獲得設定的時間段的平均值

time  power 
----  ----- 
00:00:00 346 
00:01:00 352 
00:02:00 247 

使用PHP我想從這個數據產生一個圖表,但我不想在圖表上得到1,440個點。我可能會選擇將其分成15分鐘的大塊(這會給我96分)。另外,我不想簡單地拿走每一個十五分的價值,因爲這會帶來令人誤解的結果。我想要做的就是使用一個SQL查詢,它在15分鐘的時間內返回數​​據,並以平均值的形式給出功率讀數。

輸出可能是這個樣子:

starttime avgpower 
--------- -------- 
00:00:00   342 
00:15:00   490 
00:30:00   533 

是否有一個SQL函數,會爲我做到這一點?或者我將不得不在我的PHP代碼中執行此計算?

回答

2

這裏是你的查詢:

SELECT STR_TO_DATE(CONCAT(DATE_FORMAT(`time`, '%H'), ':', (FLOOR(DATE_FORMAT(`time`, '%i')/15) * 15), ':00'), '%H:%i:%s') `starttime`, AVG(`power`) `avgpower` 
FROM `tablea` 
GROUP BY `starttime`; 

請隨時根據自己的模式來代替表(tablea)和列(timepower)的名字。

希望這會有所幫助。

+0

完美的謝謝。 – Bryan

2

您可能可以按分鐘/ 4的四捨五入值進行分組,然後選擇功率讀數字段的平均值。您可能更喜歡使用發言權函數來捨棄分鐘數。

0

有同樣的問題。正如Don Kirkby指出的,我用它解決了這個問題:

SELECT time, AVG(power) AS avgpower, ROUND(UNIX_TIMESTAMP(time)/(15*60)) AS timekey 
FROM table 
GROUP BY timekey