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

这篇博客介绍了如何在MySQL数据库中按照秒、分钟、小时、天、周、月、年的时间粒度进行分组统计,包括使用DATE_FORMAT()、DATEDIFF()、YEARWEEK()等函数的方法,并提供了相关SQL实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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_tim
要实现这个功能,你可以使用SQL的窗口函数和定时任务来完成。这里假设你有一个名为`vehicle_data`的表,其中包含`vehicle_id`, `transtime`, 和其他相关信息。 1. **创建实时统计表**: 使用窗口函数`ROW_NUMBER()`和`DENSE_RANK()`可以按照transtime对数据分组并按时间序列排列。你可以创建一个新的视图或者临时表来存储每5分钟统计结果。 ```sql CREATE VIEW hourly_vehicle_stats AS SELECT vehicle_id, transtime, COUNT(*) OVER (PARTITION BY vehicle_id ORDER BY transtime ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) as count_5min FROM vehicle_data; ``` 2. **定期更新统计结果**: 如果你的数据库支持,可以设置一个定时任务(如cron job)或触发器,在每次有新的数据插入或现有数据的transtime变化时,运行上述查询以更新`hourly_vehicle_stats`视图。 注意:这一步可能依赖于数据库的具体实现,例如MySQL的事件调度器(EVENT Scheduler),PostgreSQL的PL/pgSQL触发器,或者更复杂的第三方工具。 3. **存储结果**: 根据需求,你可能还需要将这些统计数据持久化到另一个表或存储过程,以便长期访问。比如,如果需要每的汇总,可以再创建一个进一步聚合的视图或表。 ```sql CREATE TABLE daily_summary ( vehicle_id INT, date DATE, count_5min_sum INT, ... ); ``` 然后,你可以编写脚本或程序定期(每)从`hourly_vehicle_stats`提取并插入到`daily_summary`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值