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

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

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

我们在做项目或者数据分析时,经常遇到这样的需求:统计不同时间粒度下的数据分布情况,例如,每一天中每个小时网站的访问量,某路口每半个小时通过的车辆数量等。对于此类的问题,一个sql简单的查询就能实现,故特此记录下,方便以后使用。
在MySQL中,我的表为:track
数据结构如下所示:
表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 
FROM
	(
	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 
	) a 
GROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' ) 
ORDER BY time;

结果如下:
半小时查询结果

按N分钟统计

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

SELECT time, COUNT( * ) AS num 
FROM
	(
	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 
	) a 
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值,参考下面链接
MySQL DATE_FORMAT() 函数
参考博客:

  1. MySql按天,日,小时,分钟分组数据_%y-%m-%d %h:00:00_黑风风的博客-CSDN博客
  2. mysql按半小时或1小时分组统计_mysql 按小时分组__harder的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 MySQL 的日期函数和 GROUP BY 子句来按照小时、天和月分组。 按小时分组: ``` SELECT DATE_FORMAT(date_column, '%Y-%m-%d %H:00:00') as hour, COUNT(*) as count FROM table_name GROUP BY hour; ``` 按天分组: ``` SELECT DATE(date_column) as day, COUNT(*) as count FROM table_name GROUP BY day; ``` 按月分组: ``` SELECT DATE_FORMAT(date_column, '%Y-%m') as month, COUNT(*) as count FROM table_name GROUP BY month; ``` 如果需要在无数据的情况下补0,可以使用 MySQL 的 IFNULL 函数和子询来实现: 按小时分组: ``` SELECT hours.hour, IFNULL(data.count, 0) as count FROM ( SELECT DATE_FORMAT(date_column, '%Y-%m-%d %H:00:00') as hour FROM table_name GROUP BY hour ) as hours LEFT JOIN ( SELECT DATE_FORMAT(date_column, '%Y-%m-%d %H:00:00') as hour, COUNT(*) as count FROM table_name GROUP BY hour ) as data ON hours.hour = data.hour; ``` 按天分组: ``` SELECT days.day, IFNULL(data.count, 0) as count FROM ( SELECT DATE(date_column) as day FROM table_name GROUP BY day ) as days LEFT JOIN ( SELECT DATE(date_column) as day, COUNT(*) as count FROM table_name GROUP BY day ) as data ON days.day = data.day; ``` 按月分组: ``` SELECT months.month, IFNULL(data.count, 0) as count FROM ( SELECT DATE_FORMAT(date_column, '%Y-%m') as month FROM table_name GROUP BY month ) as months LEFT JOIN ( SELECT DATE_FORMAT(date_column, '%Y-%m') as month, COUNT(*) as count FROM table_name GROUP BY month ) as data ON months.month = data.month; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值