2011-08-23 98 views
3

我有一個MySQL表,其中包含一個存儲時間的列,另一個存儲與該時間關聯的值。從單個SQL查詢返回聚合結果行

time | value 
------------ 
1 | 0.5  
3 | 1.0  
4 | 1.5 
.... | ..... 

事件不是週期性的,即時間值不會按固定間隔遞增。由於存在大量的行(> 100000),爲了顯示圖中的值,我希望能夠在整個長度範圍內彙總(平均)固定大小的區間值數據可用的時間。所以基本上輸出應該由間隔和平均值對組成。

目前,我將總時間間隔分成固定的時間塊,執行該間隔的單個聚合查詢並在應用程序代碼(Java)中收集結果。有沒有辦法在SQL中完成所有這些步驟?另外,我目前正在使用MySQL,但我可以向其他可能支持高效解決方案的數據庫開放。

+0

@cularis感謝您修復格式。 – Punit

回答

3
SELECT FLOOR(time/x) AS Inter, AVG(value) AS Mean 
FROM `table` 
GROUP BY Inter; 

其中x是您的固定大小的區間。

+0

我同意'FLOOR(time/x)'分組的想法,但我不認爲這個表達式的結果作爲區間標識符會很清楚。我想,類似於MIN(時間)AS StartTime,MAX(time)AS EndTime'(是,兩個值)的東西可能對用戶更友好。 –

+0

如果時間不是瞬時的,而是作爲兩列「開始」和「結束」存儲,這個想法是否也可以使用?那麼一些事件跨越區間界限的情況如何呢? – Punit

2

我通常通過一個「期」表來解決這個問題,所有有效的時間都在這個表中,並且與我報告的時期有關。

例如:

time  day week month year 
1   1  1  1 2001 
2   1  1  1 2001 
.... 
999   7  52 12 2010 

然後,您可以加入您的時間來「月經」表時間,並使用AVG。