MySQL 統計過去12個月的資料(包括本月),mysql本月

來源:互聯網
上載者:User

MySQL 統計過去12個月的資料(包括本月),mysql本月
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 twhere 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 DEFINERVIEW `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)bon v.month = b.month group by v.month

最後得到我們想要的結果:

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.