我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以后使用。
在MySQL中,我的表为:track
数据结构如下所示:
SELECT DATE(TimeStart) AS date, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY date
ORDER BY date;
SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:00:00') AS time, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;
结果如下:
SELECT time, COUNT( * ) AS num
SELECT Duration,
DATE_FORMAT(
concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 30 ) * 30 ),
'%Y-%m-%d %H:%i'
) AS time
FROM tarck
WHERE Flag = 0 AND Duration >= 300
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' )
ORDER BY time;
结果如下:
将上面的SQL语句稍微修改下,就可以实现按任意N分钟为时间片的分组统计,如按10分钟统计,先上代码:
SELECT time, COUNT( * ) AS num
SELECT Duration,
DATE_FORMAT(
concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) / 10 ) * 10 ),
'%Y-%m-%d %H:%i'
) AS time
FROM tarck
WHERE Flag = 0 AND Duration >= 300
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' )
ORDER BY time;
基本思路:
将datetime类型的时间转化为相应时间片的时间,例如将‘2017-03-01 01:08:19’ 转化为‘2017-03-01 01:00:00’,然后group by即可。
将按小时统计的SQL语句稍微修改下,就可以实现按分钟统计
SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:%i:00') AS time, COUNT(*) AS num
FROM track
WHERE Flag = 0 AND Duration >= 300
GROUP BY time
ORDER BY time;
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分钟,分钟进行数据分组统计mysql不同时间粒度下的分组统计按天统计按小时统计按半小时统计按N分钟统计按分钟统计mysql不同时间粒度下的分组统计我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以...
create table tb(时间 datetime , 金额 int)
insert into tb values('2007-1-1 10:00:23' , 8 )
insert into tb values('2007-1-1 10:01:24' , 4 )
insert into tb val
可以使用MySQL的DATE_FORMAT函数和GROUP BY语句来实现24小时按2小时分组的统计。
例如,假设有一张名为table1的表,其中包含两个字段:时间(time)和数值(value),您可以使用以下查询语句来按2小时分组并统计每组的数值之和:
SELECT DATE_FORMAT(time, '%Y-%m-%d %H:00:00') AS time_group, SUM(value) AS value_sum
FROM table1
GROUP BY DATE_FORMAT(time, '%Y-%m-%d %H DIV 2:00:00');
这个查询语句将会按照时间分组,每两小时为一组,然后计算每组的数值之和。DATE_FORMAT函数用于将时间格式化为年-月-日 时:00:00的形式,GROUP BY语句用于按照格式化后的时间分组。
注意,这个查询语句假设时间字段是一个DATETIME类型的字段。如果您的时间字段是一个UNIX时间戳,您需要使用UNIX_TIMESTAMP函数将其转换为DATETIME类型的时间。