MySQL 统计过去12个月的数据(包括本月)

1、问题

需要统计过去12个月的数据,如现在是2015年4月,那么我们需要统计从2014年5月到2015年4月的数据情况。而这12个月中,如果这个月没有数据的,则统计为0。

原始数据表如下图,数据是按分钟存储的。也就是说要统计每个月一共有多少条body_infared大于0的数据。

2、处理过程

2.1 获取12个月到现在的数据

select * from device_data t where
DATE_FORMAT(t.time,‘%Y-%m‘)>
DATE_FORMAT(date_sub(curdate(), interval 12 month),‘%Y-%m‘);

2.2 统计某台设备在过去12个月中每个月body_infared大于0的数据之和。

select DATE_FORMAT(t.time,‘%Y-%m‘) month,count(t.id) minute from device_data t
where t.body_infrared>0 and t.device_id=13
AND  DATE_FORMAT(time,‘%Y-%m‘)>
DATE_FORMAT(date_sub(curdate(), interval 12 month),‘%Y-%m‘)
 group by device_id,month

获取结果:

这时候我们发现,原始数据中只有三个月的数据,还有其它9个月按要求应该是显示为0的。

2.3 用一个笨点的方法获取过去12个月所有的月份。

创建一个查找过去12个月的视图,当然这里你也可以使用存储过程遍历地把12个月插入到一个临时表中,代码会更优雅一点。

CREATE
    ALGORITHM = UNDEFINED
    DEFINER = `root`@`%`
    SQL SECURITY DEFINER
VIEW `past_12_month_view` AS
    SELECT DATE_FORMAT(CURDATE(), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 2 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 3 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 4 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 5 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 6 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 7 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 8 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 9 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 10 MONTH), ‘%Y-%m‘) AS `month`
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 11 MONTH), ‘%Y-%m‘) AS `month`

查看12个月的显示情况:

select t.month from past_12_month_view t group by t.month;

2.4 把2.3的12个月的显示数据与 2.2查询结果关联查询

select v.month,ifnull(b.minute,0)  minute from past_12_month_view v
left join
(select DATE_FORMAT(t.time,‘%Y-%m‘) month,count(t.id) minute
from device_data t where
DATE_FORMAT(t.time,‘%Y-%m‘)>
DATE_FORMAT(date_sub(curdate(), interval 12 month),‘%Y-%m‘)
and t.device_id=(select d.id from device d where d.serial=‘01150100004‘)
group by t.device_id,month)b
on v.month = b.month group by v.month

最后得到我们想要的结果:

时间: 2024-10-26 07:19:28

MySQL 统计过去12个月的数据(包括本月)的相关文章

mysql 根据某一年 查询12个月的数据

1.时间字段是datetime类型 2.需要用到中间表,表结构和数据链接下载 https://pan.baidu.com/s/1sAQ78e3Ao-KwvYJlaipbKQ 3.前两个 adddate 月日需要在数据库写死 从每年的-01-01开始,-最后一个日期同理xxxx-12-31 4.下面是sql select concat(month(years.date),'月') as year, years.date, date_format(years.date, '%Y-%m') AS ye

Python得到前面12个月的数据,Python得到现在时间 前一年的数据,

#Python 实现得到现在时间12个月前的每个月 # 假设现在的时间是2016年9月25日 #得到现在的时间 得到now等于2016年9月25日 now = datetime.datetime.now() #得到今年的的时间 (年份) 得到的today_year等于2016年 today_year = now.year #今年的时间减去1,得到去年的时间.last_year等于2015 last_year = int(now.year) -1 #得到今年的每个月的时间.today_year_m

linux shell脚本自动删除mysql表前3个月的数据

RDS有一个数据库表tbl_online表,有6千万数据,需要清理,保留3个月. 步骤如下: 创建月表 将需要删除的数据写入月表 删除数据 优化表 shell如下: #!/bin/bash base="rdsxx.mysql.rds.aliyuncs.com" #前3个月的日期 months_ago=`date -d "-3 month" +"%Y-%m-%d"` #前3个月的月份,去掉前面的0 months_ago_mon=`date -d &

Oracle统计某一年中的1-12个月的数据总和

查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图 创建表 ? 1 2 3 4 5 6 create table PERSONSITUATION (   id    NUMBER not null,   rdate DATE,   nums  NUMBER ) 插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 insert into PERSONSITUATION (id

Oracle 统计某一年中的1-12个月的数据总和(非常实用)

实战案例 查询2015年1月到12个月的所有实有人口数量和往年2014年1月到12个月的实有人口数量,没有的月份显示 人口数量为0.类似效果如图 创建表 create table PERSONSITUATION ( id NUMBER not null, rdate DATE, nums NUMBER ) 插入数据 insert into PERSONSITUATION (id, rdate, nums) values (1, to_date('26-01-2015', 'dd-mm-yyyy'

实战:mysql统计指定架构的所有表的数据和索引大小情况

#统计指定架构的所有表的数据和索引大小情况 #tablesize.sh #!/bin/sh #[email protected] if [ "$#" -gt 2 ];then echo "**********************************" echo "too many input parameters" echo "**********************************" echo "

mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名) 近30天 SELECT * FROM 表名 where DATE_SUB(CURDATE(

Mycat(6):聊天消息表,按月分表 java客户端跨月查询数据

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/47039103 未经博主允许不得转载. 1,业务需求 上次分析聊天业务按照月进行拆.http://blog.csdn.net/freewebsys/article/details/47003577 具体拆分方案已经有了: 但是在操作的时候还是有点小问题,但基本上是按照这个设计实现的. 首先是mycat的,mycat正式版本是1.3.0.3-release,但是这个不包括Parti

阿里云服务器免费使用12个月可满足企业建站、开发测试等场景

疫情无情,阿里云有情,开启注册后云服务器免费试用 注册地址:https://account.aliyun.com/register/qr_register.htm 最新消息,阿里云宣布为企业用户推出云服务器免费12个月扶持计划,助力中小企业0成本上云.阿里云表示,该计划每年投入2000万,超5万中小企业受益,本计划已于2019年11月27日上线. 阿里云智能总裁张建锋在2019阿里云峰会上海站上提出“全面上云的拐点到了!”为了更好的帮助中小企业成长,帮助企业从传统IT向云计算全面转移,阿里云也加