每天的指标统计关键点是:如果这一天没有新增客户,但也需要给出值为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当成一个字符串去处理再结合日期函数获取想要的结果,而不局限于只用日期函数去处理。有疑问可评论,谢谢观看!