栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Mysql数据库不同时间粒度下的分组统计—按时间粒度:秒、分钟、小时、天、周、月、年进行分组统计

Mysql数据库不同时间粒度下的分组统计—按时间粒度:秒、分钟、小时、天、周、月、年进行分组统计

在Mysql数据库中按照不同时间粒度进行分组统计

最近遇到的需求,在Mysql数据库中按照不同时间粒度进行分组统计,返回的数据用做画echarts图使用。下面介绍以:秒、分钟、小时、天、周(本周,上周,最近7天)、月、年进行分组统计,仅以此做个人笔记和分享,粒度不够的评论后补。

一、演示数据

现在开始介绍,以下是的我用来做演示的部分测试数据
我们以统计未恢复和已恢复的告警状态为例,那首先说明一下告警状态值的含义:
‘01’,‘02’,‘03’,‘04’ 表示未恢复状态
‘10’, ‘11’, ‘12’, ‘20’ 表示已经恢复状态

1. 以秒为粒度分组统计
--  以秒为粒度分组统计
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;

实例:

2. 以分钟为粒度分组统计
-- 以分钟为粒度分组统计
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;

实例:

3 以小时为粒度分组统计
-- 以小时为粒度分组统计
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去掉即可

6. 以天为粒度分组统计最近7天的数据

以天为粒度分组统计最近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;

实例:

上述SQL中用到的函数解释 1.DATE_FORMAT()

定义和用法
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

实例:

2.DATEDIFF()

定义和用法
DATEDIFF() 函数返回两个日期之间的天数。

语法
DATEDIFF(date1,date2)
date1 和 date2 参数是合法的日期或日期/时间表达式。
注释:只有值的日期部分参与计算。

date1 比 date2 小,天数为负的N天 N为相差天数
date1 比 date2 大,天数为正的N天 N为相差天数
date1 和 date2 一样,则结果为0

实例:

3.YEARWEEK()

定义和用法
返回日期的年份和周数
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啦。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/279870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号