标签:-% 自定义 曲线图 create SQL 分组 time 下载量 间隔
遇到了个这样的需求,需要统计某个时间段内每个点下载的数量。
先给大家看最后成果图再来讲解
根据我的需求,我的表结构只需要用到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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。