我想要使用相同的URL参数折叠行。这是我目前的查询:
SELECT ADDTIME(date,time) as fecha, bytes, url FROM traffic;
这就是结果:
2014-07-07 09:05:56 14K http://feeds.feedburner.com
2014-07-07 09:05:56 14K http://feeds.feedburner.com
2014-07-07 09:11:56 14K http://feeds.feedburner.com
2014-07-07 09:17:37 350K http://www.cmmail.com
2014-07-07 09:17:40 5K http://www.cmmail.com
2014-07-07 09:17:40 10K http://www.cmmail.com
2014-07-07 09:20:26 1K http://www.google.com
2014-07-07 09:20:48 1K http://www.google.com
2014-07-07 09:20:49 1K http://www.cronista.com
2014-07-07 09:20:49 1K http://www.cronista.com
我想要的是在每5分钟间隔和总和bytes
之间对相同的URL进行分组。换句话说,我想要这个结果:
2014-07-07 09:05:00 28K http://feeds.feedburner.com
2014-07-07 09:10:00 14K http://feeds.feedburner.com
2014-07-07 09:15:00 365K http://www.cmmail.com
2014-07-07 09:20:00 2K http://www.google.com
2014-07-07 09:20:00 2K http://www.cronista.com
答案 0 :(得分:3)
换句话说,您需要将fecha
日期时间缩短到最近的5分钟标记,然后GROUP BY
修改后的fecha
列和url
列
已经有一些问题可以解决舍入时间值;您可以使用How to round a time to the nearest 15 minute segment中的top-upvoted答案对结果集进行分组,如下所示:
SELECT
FROM_UNIXTIME(
TRUNCATE(
UNIX_TIMESTAMP(
ADDTIME(date, time)
) / 300, 0
) * 300
) as fecha_5_min,
SUM(bytes) as bytes_total,
url
FROM
traffic
GROUP BY fecha_5_min, url;
如果缩进不能使技术更清晰,以下是从fecha_5_min
创建fecha
的确切步骤:
UNIX_TIMESTAMP()
; fecha
转换为某个秒数
TRUNCATE()
结果为0位小数,以删除任何余数; FROM_UNIXTIME()
请务必阅读@Erwin的回答,以便使用DIV
代替/
来避免TRUNCATE()
来电。
答案 1 :(得分:2)
使用UNIX_TIMESTAMP
,将date_time类型转换为unix纪元(秒数),
用integer division operator DIV
除以300(= 5分钟),从而删除小数位,有效地舍入到5分钟的间隔。应该最简单和最快
然后聚合。
再次乘以300后,您可以使用FROM_UNIXTIME()
转换回来,以获得良好的显示效果。
SELECT FROM_UNIXTIME((UNIX_TIMESTAMP(ADDTIME(date,time)) DIV 300) * 300) AS fecha5
, url
, sum(bytes) AS sum_bytes
FROM traffic
GROUP BY 1,2;