SQL代码解析:按地区和渠道统计用户发展情况
SQL代码解析:按地区和渠道统计用户发展情况
本篇解析一段SQL代码,该代码用于从temp_lgl_gw_dev表中提取数据,并按地区和渠道统计用户发展情况,最终插入到temp_lgl_gw_dev_result表中。
insert overwrite table temp_lgl_gw_dev_result partition (month_id = '${v_month}')
select '全国' prov_part,
chnl_type,
sum(cast(user_num as int)) user_num,--本年累计新发展用户数
sum(cast(innet_num as int)) innet_num,--本年新发展用户统计当月在网用户数
sum(cast(acct_num as int)) acct_num,--本年新发展用户统计当月出账用户数
sum(cast(m_fee as double)) m_fee,--本年新发展用户统计当月出账收入
sum(cast(total_fee as double)) total_fee--本年新发展用户本年累计出账收入
from temp_lgl_gw_dev
where month_id = '${v_month}'
group by '全国',chnl_type
union all
select b.prov_part,
a.chnl_type,
sum(cast(user_num as int)) user_num,
sum(cast(innet_num as int)) innet_num,
sum(cast(acct_num as int)) acct_num,
sum(cast(m_fee as double)) m_fee,
sum(cast(total_fee as double)) total_fee
from (
select prov_id,
chnl_type,
total_fee,
user_num,
innet_num,
acct_num,
m_fee
from temp_lgl_gw_dev
where month_id = '${v_month}'
) a
left join
(
select prov_id,
prov_desc,
case
when ord_id3 <= 10 then '北10'
when ord_id3 > 10 then '南21'
end prov_part
from DIM_PROV_ORD
) b
on a.prov_id = b.prov_id
group by b.prov_part,a.chnl_type
union all
select b.prov_desc prov_part ,
chnl_type,
user_num,
innet_num,
acct_num,
m_fee,
total_fee
from temp_lgl_gw_dev a
left join
(
select prov_id,
prov_desc
from DIM_PROV_ORD
) b
on a.prov_id = b.prov_id
where month_id = '${v_month}';
代码拆解:
该代码由三个 SELECT 语句通过 UNION ALL 连接而成,每个语句都统计了指定范围内的数据:
-
全国数据统计:
- 从
temp_lgl_gw_dev表中筛选出month_id等于${v_month}的数据。 - 按渠道类型 (
chnl_type) 进行分组,并对用户数、收入等指标进行求和。 - 结果中
prov_part字段统一设置为 '全国'。
- 从
-
按南北区域统计:
- 首先从
temp_lgl_gw_dev表中筛选出指定月份的数据,并将其命名为子查询a。 - 从
DIM_PROV_ORD表中读取地区信息,并根据ord_id3字段将地区划分为 '北10' 和 '南21' 两个区域,并将其命名为子查询b。 - 将
a和b通过prov_id字段进行左连接,并将连接后的结果按区域 (prov_part) 和渠道类型 (chnl_type) 进行分组,统计各项指标的总和。
- 首先从
-
按省份统计:
- 与第二部分类似,也是将
temp_lgl_gw_dev表和DIM_PROV_ORD表进行左连接,但这次直接使用prov_desc字段作为地区标识 (prov_part),并按其和渠道类型进行分组统计。
- 与第二部分类似,也是将
总结:
该SQL代码通过三次查询分别统计了全国、南北区域和各个省份的用户发展情况,并将结果合并到一起插入到目标表中,为后续的数据分析提供了基础数据。
代码优化建议:
- 可以考虑使用
WITH AS语句将重复使用的子查询定义为公用表表达式 (CTE), 提高代码可读性和维护性。 - 可以根据实际情况考虑是否需要使用
LEFT JOIN,如果确定两个表有关联数据,可以使用INNER JOIN提高查询效率。 - 可以对SQL代码进行必要的注释,方便他人理解代码逻辑。
原文地址: https://www.cveoy.top/t/topic/fBxe 著作权归作者所有。请勿转载和采集!