曲线图需要的连续的且按自定义时间间隔分组的数据的SQL
作者:互联网
遇到了个这样的需求,需要统计某个时间段内每个点下载的数量。
先给大家看最后成果图再来讲解
根据我的需求,我的表结构只需要用到device_id,create_time这两个字段,大概思路是,先根据时间分组查出下载量,再去连一张时间表保证时间段连续。
其中有几个要注意的问题是:
第一,时间分组函数DATE_FORMAT(a.create_time,'%Y-%m-%d %H'),
需要根据用户输入的时间间隔判断是按什么度量分组。如下图:
时间间隔为d
时间间隔 | 按什么度量分组 |
d<1天 | 小时 '%Y-%m-%d %H' |
1天<d<1月 | 天 '%Y-%m-%d' |
1月<d<1年 | 月 '%Y-%m' |
d>1年 | 年 '%Y' |
第二,分组后查出来的结果不一定是连续的,比如查11点到16点的下载量,可能12点没有下载,那12点这条记录就出不来。
如下图我只执行我分组的sql出来的是这样子的
所以我们要连接一张对应时间间隔有连续时间点的表
可以看看我右连的那张连续时间表结果
最后右连接时间表,把没有下载量的时间点用IFNULL函数设为0。
就可以啦~其实思路还是挺清晰。只是要根据时间间隔来选择是按小时还是天还是月还是年分组的时候有点麻烦,我用的mybatis,因为间隔传参mapper.xml里面写了一大片代码!!!害!!!!!
最后!我懂的!sql语句附上哈哈哈哈哈哈哈哈哈哈哈哈哈
select IFNULL(aa.deviceIdCount,0) deviceIdCount,bb.time
from (
select DATE_FORMAT(a.create_time,'%Y-%m-%d %H') createDate, count(DISTINCT a.device_id) deviceIdCount
from device_download_info a where a.create_time>='2020-11-11 00:00:00' and a.create_time <='2020-11-11 08:59:59'
GROUP BY DATE_FORMAT(a.create_time,'%Y-%m-%d %H')
) aa
right join
(select DATE_FORMAT(@date := DATE_ADD(@date,interval 1 hour),'%Y-%m-%d %H') time
from( select @date := DATE_ADD('2020-11-11 00:00:00',interval -1 hour)
from device_download_info
)times where @date <= DATE_FORMAT('2020-11-11 08:59:59','%Y-%m-%d %H')
)bb
on aa.createDate = bb.time order by bb.time
标签:-%,自定义,曲线图,create,SQL,分组,time,下载量,间隔 来源: https://blog.csdn.net/qq_29376717/article/details/110437216