mysql查询某段时间连续日期的数据并计数,无数据补充0

(1)在网上看了很多人写的一些sql语句根本运行不起来,所以结合一些网上学到的,再加上我从老师那儿学到的,写了一个真正能运行起来的sql语句,希望对你有帮助。

总的来说,要用mysql获取一段连续时间内的数据,就是查询建立了两个临时表,用右连接或者左连接将两个表连接起来,第一个表是你查询想得到数据的表,第二张表是获取连续日期

(2)在这里,要先讲几个mysql函数,具体要了解更多函数:菜鸟教程

IFNULL(v1,v2)

如果 v1 的值不为 NULL,则返回 v1,否则返回 v2。

UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

(3)比如说第一个表我想得到的数据是这样子的:(得到某个时间七天前到这个时间之间的数据,并得到每条数据的数量),可以看见好几个日期没有数据它就没有,所以我们就需要一段连续日期表

 (4)所以第二张表先获取连续日期,是这个样子的:

select a.Date
from 
  (select '2020-12-09' - interval (a.a + (10 * b.a) + (100 * c.a)) day as Date
   from 
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as a CROSS
   join
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as b CROSS
   join
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as c) a

(5)以上,最后修改一些细节,代码就是这样子的:

第一个查询出来得到的临时表命名为t1

第二个连续日期的临时表命名为t2

select t2.Date as date,ifnull(t1.alarm_count,0) as alarm_count
from (
      --数据查询
	  select date(sensor_time) as sensor_date,count(1) as alarm_count 
	  from t_sensor_alarm
	  group by date(sensor_time))t1
--右连接
right join(
 --日期查询
 select a.Date
 from 
 (select '2020-12-09' - interval (a.a + (10 * b.a) + (100 * c.a)) day as Date
   from 
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as a CROSS
   join
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as b CROSS
   join
     (select 0 as a
      union all select 1
      union all select 2
      union all select 3
      union all select 4
      union all select 5
      union all select 6
      union all select 7
      union all select 8
      union all select 9) as c) a)t2
on t1.sensor_date=t2.Date
where (t2.Date >= '2020-12-09' + interval -6 day) 			
and (t2.Date <= '2020-12-09')

(6)最后运行:(把注释去掉)

(7)解析一下:

 从我的t_sensor_alarm表中获取某个时间段的数据并count,第一个临时表

查询某个时间段中间连续的日期,第二个临时表

因为想得到的是一段连续日期的记录总数,都有日期,所以第一个表右连接第二个表,有些日期没有数据的添加0,使用ifnull函数

最后连接两个表的时候我修改了一下,在第三个临时表添加条件判断where语句(让日期在那个范围内),因为从第一个表中得到的是只有那个时间段的数据,所以要想得到最终的日期及其count结果就得把条件语句加上。

希望对你有帮助

猜你喜欢

转载自blog.csdn.net/Januea/article/details/120059079