2011-05-05 25 views
0

我有一個存儲每五分鐘網絡利用率的mysql表,我想現在使用這些數據進行圖形化。有沒有一種方法可以指定開始時間和結束時間以及我需要的存儲桶/樣本的數量,而且MySQL可能在某種程度上有義務:?MySQL:動態創建桶

我的表

+---------------------+-----+ 
| Tstamp    | QID | 
+---------------------+-----+ 
| 2010-12-10 15:05:39 | 20 | 
| 2010-12-10 15:06:09 | 26 | 
| 2010-12-10 15:06:14 | 27 | 
| 2010-12-10 15:06:18 | 28 | 
| 2010-12-10 15:06:23 | 40 | 
| 2010-12-10 15:10:38 | 20 | 
| 2010-12-10 15:11:12 | 26 | 
| 2010-12-10 15:11:17 | 27 | 
| 2010-12-10 15:11:21 | 28 | 
------ SNIP ------ 

所以我可以指定我需要從過去24小時內20個樣本。

謝謝!

惡劣

回答

2

您可以將DATETIME轉換爲UNIX_TIMESTAMP,並與部門和模玩...

+1

(只需要除法和TRUNC不是模) – symcbean 2011-05-05 12:24:36

+0

你能提出一個合適的查詢嗎? – 2011-05-06 05:46:42

+0

嗯,這是TRUNC((UNIX_TIMESTAMP(tstamp) - UNIX_TIMESTAMP(start_time))/ 300)或其他... – peufeu 2011-05-06 06:36:06

0

這裏是你可以用一個簡單的查詢。如果給定時間範圍內的請求樣本數量超過該範圍的可用記錄的一半(這意味着存儲桶大小爲1),則注意它不起作用。

-- Configuration 
SET @samples = 4; 
SET @start = '2011-05-06 19:44:00'; 
SET @end = '2011-05-06 20:46:50'; 
-- 

SET @bucket = (SELECT FLOOR(count(*)/@samples) as bucket_size FROM table1 
WHERE Tstamp BETWEEN @start AND @end); 

SELECT 
     SUM(t.QID), FLOOR((t.ID-1)/@bucket) as bucket 
FROM (SELECT QID , @r:[email protected]+1 as ID 
    FROM table1 
    JOIN (SELECT @r:=0) r 
    WHERE Tstamp BETWEEN @start AND @end 
    ORDER BY Tstamp) as t 
GROUP BY bucket 
HAVING count(t.QID) = @bucket 
ORDER BY bucket; 

P.S.我相信有一個更優雅的方式來做到這一點,但由於沒有人提供了一個工作查詢,我希望這有助於。