mysql按天,小时,半小时,N分钟,分钟进行数据分组统计

mysql按天,小时,半小时,N分钟,分钟进行数据分组统计

mysql不同时间粒度下的分组统计

按天统计

按小时统计

按半小时统计

按N分钟统计

按分钟统计

mysql不同时间粒度下的分组统计

我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以后使用。

在MySQL中,我的表为:track

数据结构如下所示:

按天统计

SELECTDATE(TimeStart)ASdate,COUNT(*)ASnumFROMtrackWHEREFlag=0ANDDuration>=300GROUPBYdateORDERBYdate;

按小时统计

SELECTDATE_FORMAT(TimeStart,'%Y-%m-%d %H:00:00')AStime,COUNT(*)ASnumFROMtrackWHEREFlag=0ANDDuration>=300GROUPBYtimeORDERBYtime;

结果如下:

按半小时统计

SELECTtime,COUNT(*)ASnumFROM(SELECTDuration,DATE_FORMAT(concat(date(TimeStart),' ',HOUR(TimeStart),':',floor(MINUTE(TimeStart)/30)*30),'%Y-%m-%d %H:%i')AStimeFROMtarckWHEREFlag=0ANDDuration>=300)aGROUPBYDATE_FORMAT(time,'%Y-%m-%d %H:%i')ORDERBYtime;

结果如下:

按N分钟统计

将上面的SQL语句稍微修改下,就可以实现按任意N分钟为时间片的分组统计,如按10分钟统计,先上代码:

SELECTtime,COUNT(*)ASnumFROM(SELECTDuration,DATE_FORMAT(concat(date(TimeStart),' ',HOUR(TimeStart),':',floor(MINUTE(TimeStart)/10)*10),'%Y-%m-%d %H:%i')AStimeFROMtarckWHEREFlag=0ANDDuration>=300)aGROUPBYDATE_FORMAT(time,'%Y-%m-%d %H:%i')ORDERBYtime;

基本思路:

将datetime类型的时间转化为相应时间片的时间,例如将‘2017-03-01 01:08:19’ 转化为‘2017-03-01 01:00:00’,然后group by即可。

按分钟统计

将按小时统计的SQL语句稍微修改下,就可以实现按分钟统计

SELECTDATE_FORMAT(TimeStart,'%Y-%m-%d %H:%i:00')AStime,COUNT(*)ASnumFROMtrackWHEREFlag=0ANDDuration>=300GROUPBYtimeORDERBYtime;

DATE_FORMAT功能强大,可以根据format字符串格式化date值,参考下面链接

http://www.w3school.com.cn/sql/func_date_format.asp

参考博客:

https://blog.csdn.net/kaka_buka/article/details/52614643

https://blog.csdn.net/Beingccccc/article/details/78685490

你可能感兴趣的:(mysql按天,小时,半小时,N分钟,分钟进行数据分组统计)