Mysql 如何在日期/时间范围内折叠相同的行?
我想用相同的URL参数折叠行。这是我当前的查询:Mysql 如何在日期/时间范围内折叠相同的行?,mysql,sql,group-by,aggregate-functions,Mysql,Sql,Group By,Aggregate Functions,我想用相同的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
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分钟间隔之间对相同的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
使用,
除以300(=5分钟),从而删除小数位数,有效地将间隔四舍五入为5分钟。应该是最简单最快的。
然后加总 您可以在再次乘以300后转换回,以获得良好的显示效果
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;
使用,
除以300(=5分钟),从而删除小数位数,有效地将间隔四舍五入为5分钟。应该是最简单最快的。
然后加总 您可以在再次乘以300后转换回,以获得良好的显示效果
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;
换句话说,您需要将您的
fecha
日期时间向下舍入到最接近的5分钟标记,然后按修改的fecha
列和url
列分组
已经有一些问题涉及舍入时间值;您可以使用来自的得票最多的答案对结果集进行分组,如下所示:
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
创建fecha_5_min
的确切步骤:
- 使用将原始的fecha转换为秒数李>
- 将该秒数除以300秒(即5分钟)李>
TRUNCATE()
将结果保留到小数点后0位,以删除任何余数李>
- 将“三百秒”乘以300,回到单位秒李>
- 使用将秒数转换回日期和时间
请务必阅读@Erwin的答案,了解使用DIV
而不是
来避免TRUNCATE()
调用的好处。换句话说,您需要将fecha
日期时间舍入到最接近的5分钟标记,然后根据修改的fecha
列和url
列对进行分组
已经有一些问题涉及舍入时间值;您可以使用来自的得票最多的答案对结果集进行分组,如下所示:
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
创建fecha_5_min
的确切步骤:
- 使用将原始的fecha转换为秒数李>
- 将该秒数除以300秒(即5分钟)李>
TRUNCATE()
将结果保留到小数点后0位,以删除任何余数李>
- 将“三百秒”乘以300,回到单位秒李>
- 使用将秒数转换回日期和时间
请务必阅读@Erwin的答案,了解关于使用DIV
而不是/
来避免TRUNCATE()
调用的好观点。不要将日期和时间存储为单独的实体!不要将日期和时间存储为单独的实体!谢谢你的解释。。有了这两个答案,a就成功了。group by上的括号给了我一个错误:“操作数应该包含1列”,所以我使用了Erwin的方法,tah dah!谢谢你的解释。。有了这两个答案,a就成功了。group by上的括号给了我一个错误:“操作数应该包含1列”,所以我使用了Erwin的方法,tah dah!