持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
在大数据开发中肯定会遇到统计类的需求,比如统计一年内每个月的订单数,并按照类目和城市区分,这时候就需要对订单数进行count处理,不仅要统计订单数还要统计订单总额,需要对订单额进行sum处理,并按照类目和城市分组统计。 下面举几个例子详细描述一下这类需求的写法。
首先这类的需求肯定会利用到临时表,在平时的数据需求开发中也要多用临时表来代替联表查询,这个可以提高查询性能,少用一些连表查询的方式。
首先将底表数据进行过滤,取出不同指标的统计时间,这里要用到union all的写法,所以取出的字段要保证一模一样才行,然后再用临时表将不同的指标数据拉成一张横表,此时不同的指标均有统计时间,指标参数,关联键等,即可为后续的统计做准备。
当然也可以在下面的具体正文逻辑中,将统计时间按照指定格式输出,将所有指标union all出来,然后将这张大横表拉成竖表,对数据进行分组汇总,按照类目和城市group by一下。
select
id
,nvl(stat_day,-911)
,nvl(t0.a1_cnt ,0) as a1_cnt -- 指标1
,nvl(t0.a2_cnt ,0) as a2_cnt -- 指标2
,nvl(t0.a3_amount_sum ,0) as a3_sum -- 指标3
,nvl(t0.a4_cnt ,0) as a4_cnt -- 指标4
,nvl(t0.a5_ct_cnt ,0) as a5_cnt -- 指标5
,nvl(t0.a6_cnt ,0) as a6_cnt -- 指标6
,nvl(t0.a7_cnt ,0) as a7_cnt -- 指标7
from
(
select
substr(fact_time,1,10) as stat_day -- 自然月,月维度报表
,count(distinct if(idx='a1',id,null)) as a1_cnt
,count(distinct if(idx='a2',id,null)) as a2_cnt
,count(distinct if(idx='a3',id,null)) as a3_cnt
,count(distinct if(idx='a4',id,null)) as a4_cnt
,sum(if(idx='a5',nvl(amount,0),0)) as a6_cnt
,count(distinct if(idx='a6',id,null)) as a5_cnt
from
(
select
id
,create_time as fact_time -- 触发时间
,'a1' as idx -- 类型
,0 as amount --金额
from temp_test_detail
where create_time < '${0d_yyyy-MM-dd}'
union all
select
id
,a2_time as fact_time -- 触发时间
,'a2' as idx -- 类型
,test_amount as amount --金额
from temp_test_detail
where a2_time < '${0d_yyyy-MM-dd}'
)t1
)t0