MySQL:动态创建存储桶

MySQL:动态创建存储桶,mysql,graph,charts,Mysql,Graph,Charts,我有一个mysql表,每五分钟存储一次网络利用率,现在我想用这个数据来作图。有没有一种方法可以让我只指定开始时间和结束时间以及我需要的bucket/samples的数量,而MySQL可以在某种程度上满足我的要求: 我的桌子 +---------------------+-----+ | Tstamp | QID | +---------------------+-----+ | 2010-12-10 15:05:39 | 20 | | 2010-12-10 15:06

我有一个mysql表,每五分钟存储一次网络利用率,现在我想用这个数据来作图。有没有一种方法可以让我只指定开始时间和结束时间以及我需要的bucket/samples的数量,而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个样本

谢谢


Harsh

您可以将日期时间转换为UNIX\u时间戳,并使用除法和模…

以下是一个可以使用的示例查询。请注意,如果给定时间范围内请求的样本数超过该范围内可用记录的一半(这意味着桶大小为1),则该方法不起作用


另外,我相信有一种更优雅的方法可以做到这一点,但由于没有人提供有效的查询,我希望这能有所帮助。

(只需要除法和TRUNC而不是模)你能为这一点建议一个合适的查询吗?嗯,它是TRUNC((UNIX\u TIMESTAMP(tstamp)-UNIX\u TIMESTAMP(start\u time))/300)或其他。。。
-- 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;