Hi DaXiong
生活明朗,万物可爱❤️
人间值得,未来可期❤️
Hi ,April 23
先养眼,再看题
❤️
今天是我阳哥的彩虹蛋糕

今天刷的题是按时间统计
这个需求还是很常见呀
主要是时间函数的使用


Question
假设传过来的时间字段的值是
2020-02-02 02:02:02
我们需要分时间统计
按天统计
按小时统计
按10分钟统计
按1分钟统计
.....


Answer
一般我们的需求是按年,季,月,周进行汇总统计,这样的话,一般hive都是按照时间进行分区,可直接统计即可,但架不住总有一些奇奇怪怪的需求,在此会对每个sql进行一个讲解。
按天汇总
在这里,我们可以使用Date()方法
Date() ==> 传进去的是时间字典,返回的是YYYY-MM-DD
而Datetime() ==> 同上,但返回的是
YYYY-MM-DD HH:MM:ss
SELECTDATE(TimeStart) AS date,COUNT(*) AS numFROM trackWHERE Flag = 0 AND Duration >= 300GROUP BY dateORDER BY date;


按小时汇总
这里的话,需要先将时间进行格式化,然后再单独提取出小时需要使用到DATE_FORMAT()
DATE_FORMAT() ==> 以不同的格式显示日期/时间数据。
SELECTDATE_FORMAT(TimeStart, '%Y-%m-%d %H:00:00') AS time,COUNT(*) AS numFROM trackWHERE Flag = 0 AND Duration >= 300GROUP BY timeORDER BY time;


按10分钟汇总
首先,我们要有思路,就是说将传进来的时间,将分钟做除法,然后获取到是10分钟还是20分钟还是30分钟,然后再进行统计汇总,这里需要用到这几个时间函数:
hour():获取传进来时间的小时字段
minute():获取传进来时间的分钟字段
floor():四舍五入,向上取整数
SELECTtime,COUNT( * ) AS numFROM(SELECT Duration,DATE_FORMAT(concat( date( TimeStart ), ' ', HOUR ( TimeStart ), ':', floor( MINUTE ( TimeStart ) 10 ) * 10 ),'%Y-%m-%d %H:%i') AS timeFROM tarckWHERE Flag = 0 AND Duration >= 300) aGROUP BY DATE_FORMAT( time, '%Y-%m-%d %H:%i' )ORDER BY time;


按1分钟汇总
在对每分钟进行排序的时候,其实思路还是跟上面一样,通过时间函数获取到具体的分钟值,然后再汇总统计,具体的方法和通过小时进行汇总是一样的。
SELECT DATE_FORMAT(TimeStart, '%Y-%m-%d %H:%i:00') AS time, COUNT(*) AS numFROM trackWHERE Flag = 0 AND Duration >= 300GROUP BY timeORDER BY time;


在此,根据时间进行汇总统计暂时告一段落。
如果小伙伴还有其他的想法或问题也欢迎在评论区留言,让我们一起成长为大佬,赚大钱!

郭大熊的公众号
个人博客 : www.guodaxiong.com
如果不曾见过阳光,我本可以忍受黑暗
Hi GuoDaXiong
我是狗子
祝你幸福






