MySQL:动态创建存储桶

时间:2011-05-05 10:30:11

标签: mysql graph charts

我有一个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 个答案:

答案 0 :(得分:2)

您可以将DATETIME转换为UNIX_TIMESTAMP,并使用除法和模数...

答案 1 :(得分: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:=@r+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。我相信有更优雅的方法可以做到这一点,但由于没有人提供有效的查询,我希望这会有所帮助。