hive计算历史每一天、每一周、每一月的新增客户、累计客户、交易客户的计算思路

每天的指标统计关键点是:如果这一天没有新增客户,但也需要给出值为0,也就是说实际统计的日期中没有某天的日期,需要如何操作呢?

实战:创建时间维度的表,以天为单位,具体方法可自己查询。这时候用此时间维度表left join关联我们统计的结果即可,为null的值也就是没有新增客户,用nvl转化为0即可,这样就能得出所要历史每天的新增客户数;

每一天的的累计客户呢?

实战:由历史每天的新增客户表,用sum()over(partition by xx order by xx  asc)  as aaa ,aaa就是每天的累计客户,原理为计算每个分区从第一行累加到当前行,sum的窗口函数还有其它用法,具体的用法自己查询;这里还有有一个不太适合的方法,就是在新增客户表t1 inner join 新增客户表 t2,然后根据t1.date>t2.date,由sum求出,这里就会产生笛卡尔积,当历史的天数比较多时,这种方法非常不合时宜,应避免。

每一周的新增客户呢?

思路:每一天的新增客户给出,就是把某天的新增客户都转化为所在周的周天,按周天聚合累加

实战:选取历史最早的周天日期a,拿某一天x减去a再除以7取余数,sql为:

case when pmod(datedifff(x,a),7)= '0'  then x

when pmod(datedifff(x,a),7)= '1'  then  date_sub(x,'1')--周一转化为周日

when pmod(datedifff(x,a),7)= '2'  then date_sub(x,'2')--周二转化为周日

when pmod(datedifff(x,a),7)= '3'  then date_sub(x,'3')--周三转化为周日

when pmod(datedifff(x,a),7)= '4'  then  date_sub(x,'4')--周四转化为周日

when pmod(datedifff(x,a),7)= '5'  then  date_sub(x,'5')--周五转化为周日

when pmod(datedifff(x,a),7)= '6'  then  date_sub(x,'6')--周六转化为周日

end as date

每一月的新增客户比较简单:直接用substr去日期的前7位 substr(date, 1, 7),按月累加。

实时上我们对时间操作是完全可以把date当成一个字符串去处理再结合日期函数获取想要的结果,而不局限于只用日期函数去处理。有疑问可评论,谢谢观看!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容