最近遇到的需求,在Mysql数据库中按照不同时间粒度进行分组统计,返回的数据用做画echarts图使用。下面介绍以:秒、分钟、小时、天、周(本周,上周,最近7天)、月、年进行分组统计,仅以此做个人笔记和分享,粒度不够的评论后补。
一、演示数据现在开始介绍,以下是的我用来做演示的部分测试数据
我们以统计未恢复和已恢复的告警状态为例,那首先说明一下告警状态值的含义:
‘01’,‘02’,‘03’,‘04’ 表示未恢复状态
‘10’, ‘11’, ‘12’, ‘20’ 表示已经恢复状态
-- 以秒为粒度分组统计
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d %H:%i:%s') AS btime,
sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered`
FROM yusys_aiops_alarm.alarm_list_info_view arm
where arm.status = 0
GROUP BY btime
ORDER BY btime;
实例:
-- 以分钟为粒度分组统计
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d %H:%i:00') AS btime, sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered`
FROM yusys_aiops_alarm.alarm_list_info_view arm
where arm.status = 0
GROUP BY btime
ORDER BY btime;
实例:
-- 以小时为粒度分组统计
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d %H:00') AS btime,
sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered`
FROM yusys_aiops_alarm.alarm_list_info_view arm
where arm.status = 0
GROUP BY btime
ORDER BY btime;
4 以天为粒度分组统计
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d %H:00') AS btime,
sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered`
FROM yusys_aiops_alarm.alarm_list_info_view arm
where arm.status = 0
GROUP BY btime
ORDER BY btime;
5 分组统计上周的数据
-- 分组统计上周的数据
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d') AS btime,
sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered`
FROM yusys_aiops_alarm.alarm_list_info_view arm
where YEARWEEK(date_format(arm.begin_time,'%Y-%m-%d')) = YEARWEEK(now())-1
GROUP BY btime
ORDER BY btime;
查询本周的数据不需要减一,将YEARWEEK(now())-1 的-1去掉即可
以天为粒度分组统计最近7天告警状态的数据
-- 以天为粒度分组统计 查询最近7天的数据
SELECt
DATE_FORMAT(arm.begin_time, '%Y-%m-%d') AS btime,
sum(`arm`.`alarm_status` in('01','02','03','04')) AS `unrecovered`,
sum(`arm`.`alarm_status` in('10','11','12','20')) AS `recovered` FROM yusys_aiops_alarm.alarm_list_info_view arm
where DATE_SUB(CURDATE(), INTERVAL 7 DAY) < date(arm.begin_time)
GROUP BY btime
ORDER BY btime;
实例:
定义和用法
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。
语法
DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。
format: %Y-%m-%d %H:%i:%s 结果为:2021-09-27 11:38:27
format: %Y-%m-%d %H:%i:00 结果为:2021-09-27 11:38:00
format: %Y-%m-%d %H:00:00 结果为:2021-09-27 11:00:00
format: %Y-%m-%d %H:%i 结果为:2021-09-27 11:38
format: %Y-%m-%d 结果为:2021-09-27
format: %Y-%m 结果为:2021-09
format: %Y 结果为:2021
实例:
定义和用法
DATEDIFF() 函数返回两个日期之间的天数。
语法
DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式。
注释:只有值的日期部分参与计算。
date1 比 date2 小,天数为负的N天 N为相差天数
date1 比 date2 大,天数为正的N天 N为相差天数
date1 和 date2 一样,则结果为0
实例:
定义和用法
返回日期的年份和周数
YEARWEEK()函数返回给定日期的年和周数(0到53之间的数字)
语法
YEARWEEK(date, firstdayofweek)
参数 描述
date 需要。从中提取年和周数的日期或日期时间值
firstdayofweek
可选的。指定星期几。可以是以下之一:
0 星期的第一天是星期日
1 一周的第一天是星期一,第一周超过3天
2 星期的第一天是星期日
3 一周的第一天是星期一,第一周超过3天
4 一周的第一天是星期日,第一周超过3天
5 一周的第一天是星期一
6 一周的第一天是星期日,并且第一周超过3天
7 一周的第一天是星期一
实例:
2021年第39周 (默认 周日当做一周开始)
到此,然后什么最近半小时、最近一小时、最近N天等的分组情况,直接加上WHERe条件就OK啦。



