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

时间:2014-07-08 20:36:47

标签: 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         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 

2 个答案:

答案 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转换为某个秒数
  • 将该秒数除以300秒(即5分钟);
  • TRUNCATE()结果为0位小数,以删除任何余数;
  • 将“三百秒”的数量乘以300以返回单位秒;
  • 使用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;

SQL Fiddle.