我正在尝试为MySQL编写一个SQL语句。我有一系列服务器的统计数据,每半小时报告一次。我有一个统计表,其列与此类似:
server varchar(64),
time datetime,
bytesIn int,
bytesOut int
现在,我想生成一系列报告,这些报告在所有服务器上的1小时或1天内整理所有bytesIn和bytesOut。 即。我知道我需要将SUM(bytesIn)作为bytesIn,SUM(bytesOut)作为bytesOut,但不知道如何将所有时间“聚集”为每小时/每日桶,并且还返回“clumped”时间。 也就是说,返回的数据应如下所示:
Time,bytesIn,bytesOut
12:00,1024,2048
13:00,4096,8192
etc
我知道这应该很简单,但我迷路了。有人可以帮忙吗?
答案 0 :(得分:4)
也许您可以使用DATE_FORMAT()功能和分组。这是一个例子,希望你能适应你的确切需求。
SELECT
DATE_FORMAT( time, "%H:%i" ),
SUM( bytesIn ),
SUM( butesOut )
FROM
stats
WHERE
time BETWEEN <start> AND <end>
GROUP BY
DATE_FORMAT( time, "%H:%i" )
如果您的时间窗口超过一天,并且您使用示例格式,则不同日期的数据将汇总到“时段”存储桶中。如果原始数据不是完全按小时计算,则可以使用"%H:00"
来平滑原始数据。
答案 1 :(得分:0)
会是这样的吗?
SELECT substr( time, 12, 2) AS time, sum( bytesIn ) AS bytesIn, sum( bytesOut ) AS bytesOut
GROUP BY substr( time, 12, 2)
它会依赖你的时间戳字段,总是有一个标准的yyyy-mm-dd-hh.nn.ss格式,但我相信你可以使用to_date或其他东西解决这个问题 - 不知道你是怎么做的存储了你的时间戳......