Mysql 如何在日期/时间范围内折叠相同的行?

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

我想用相同的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分钟间隔之间对相同的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!