ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

曲线图需要的连续的且按自定义时间间隔分组的数据的SQL

2020-12-01 16:29:07  阅读:233  来源: 互联网

标签:-% 自定义 曲线图 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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有