实习期间基于业务的SQL代码整理
1.1某时间段某省的活跃用户数
统计口径:活跃用户数 (dmid_client_user_detail_d_yyyymm 客户端细节表,MID层)
prov_id字段中15表示江苏省 (ddim_province省份号段表,关联prov_id)
msidn字段表示手机号
参考代码:
SELECT COUNT(DISTINCT( msisdn) )
FROM dmid_client_user_detail_d_201808
WHERE oprt_date BETWEEN '20180801' AND '20189809'
AND prov_id='15';
解释: 统计江苏省2018年8月1日至8月9日的客户端手机活跃用户数,周报提取活跃用户数是本月累积的方式,若在周报需求中提取20180810-20180817的活跃用户,则相当于提取本月截至20180817的活跃用户数。
1.2提取特会用户数
统计口径: 会员日订购用户数明细表 dmid_mem_order_detail_d_yyyymm
mem_lvl字段中3表示特会
prov_id字段中15表示江苏省
mem_status字段表示中0表示用户状态正常
msidn字段表示手机号
deal_day字段表示业务时间
参考代码:
SELECT COUNT(DISTINCT(msisdn))
FROM dmid_mem_order_detail_d_201808
WHERE mem_lvl='3'
AND prov_id='15'
AND deal_day BETWEEN '20180801'AND '20180809'
AND mem_status='0'
解释:统计江苏省2018年8月1日至8月9日的客户端手机特级会员人数,特会人数可直接选取对应时间段进行统计。
1.3 提取某省付费白金会员用户数
统计口径:白金会员用户明细表 dmid_member_pt_detail_m_yyyymm
fee_flag字段中2表示付费
prov_id字段中15表示江苏省
参考代码:
SELECT COUNT(DISTINCT( msisdn) )
FROM dmid_member_pt_detail_m_201808
WHERE fee_flag='2'
AND prov_id='15'
1.4 提取指定日期的活跃用户数
统计口径:活跃用户数 (dmid_client_user_detail_d_yyyymm 客户端细节表,MID层)
msidn字段表示手机号,login_no登录名称
提取思路是将8.1号和7.26-7.31 的活跃用户数的取出,两个结果进行左连接,若msisdn2中有值,则说明8.1号的活跃用户在7.26-7.31日活跃过,因此需要将最后的结果限定为B.msisdn2 中的值为空,然后再统计A.msidn1的数量。
参考代码:
SELECT COUNT(msisdn1)
FROM(SELECT DISTINCT( COALESCE(msisdn, login_no, imei_no, imsi_no)) as msisdn1
FROM dmid_client_user_detail_d_201808
WHERE oprt_date =‘20180801’
AND prov_id=’15’ ) AS A
LEFT JION (SELECT DISTINCT(COALESCE(B.msisdn,B.login_no, B.imei_no, B.imsi_no)) AS msisdn2
FROM dmid_client_user_detail_d_201807
WHERE oprt_date BETWEEN '20180726' AND '20180731')AS B
ON A.msisdn1=B.msisdn2
WHERE B.msisdn2 IS NULL;
解释:提取8.1号的活跃用户数,但其中不包含7.26-7.31 的活跃用户数
COALESCE() 函数用来进行空值处理,COALESCE(expression,value1,value2,value3,…,valuem)
函数将返回包括expression在内的所有参数中的第一个非空表达式,在上述代码中用于提取唯一标识用户的信息,以msisdn,login_no,imei_no, imsi_no逐级递减去重。
2.1 提取指定艺人粉丝数
统计口径: 竞品歌曲信息数据表:dmrt_prov_market_comp_music
DPI入库原始数据表:dmrt_prov_market_dpi
IMEI电话号码表:dmrt_prov_market_imei_phone
提取思路是“竞品歌曲信息数据表”中有艺人信息,通过过滤指定艺人,用它们的歌曲ID关联“DPI入库原始数据表”,找到用户IMEI/手机信息。只有IMEI信息的,用“IMEI电话号码表”查出手机号码,并反馈能找到手机号码的用户数。
参考代码:
–取出9位艺人对应的歌曲ID
CREATE TABLE tmp_liting_market_m1 AS
SELECT DISTINCT TRIM(song_id) AS song_id ---trim(用于去空)
FROM migu.dmrt_prov_market_comp_music -----歌单表
WHERE singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%'
OR singer_nam like '%XXX%';
---取听过9位艺人歌曲的用户即试听次数,去空
CREATE TABLE tmp_liting_market_m2 AS
SELECT aa.lis_cnt
,aa.song_id
,aa.phone_no
FROM
(SELECT a.lis_cnt,a.song_id,
CASE WHEN LENGTH(a.imei) = 11THEN a.imei ELSE b.phone_no END phone_no
--一般imei号为14位,若imei号为11位则怀疑该imei号为手机号
FROM migu.dmrt_prov_market_dpi AS a
LEFT JOIN migu.dmrt_prov_market_imei_phone AS b
ON a.imei = b.imei ) AS aa
INNER JOIN tmp_liting_market_m1 AS bb --9位艺人的歌曲ID表
ON aa.song_id=bb.song_id
AND aa.phone_no<>’’ --phone_no 不为空
-----汇总试听次数
CREATE TABLE tmp_liting_market_m3 AS
SELECT phone_no , lis_cnt
FROM
(SELECT phone_no ,sum(lis_cnt) as lis_cnt
FROM tmp_liting_market_m2
GROUP BY phone_no ) AS a
ORDER BY lis_cnt DESC
解释:CASE WHEN LENGTH(a.imei) = 11THEN a.imei ELSE b.phone_no END phone_no
若a. imei的长度为11,那么将a.imei 填入phone_no列,否则将b.phone_no填入phone_no列
汇总试听次数是为了避免重复统计用户数,若一个人能既是蔡依林的粉丝又是朴树的粉丝,以电话号码汇总就可以避免将其统计两次。
3.1白金会员留存率
统计口径:hr_dmrt_client_user_profile_sum –6个月大宽表数据汇总表
if_1_lc --新用户次日留存,1是,0否
if_7_lc --新用户7日留存,1是,0否
if_30_lc --新用户30日留存,1是,0否
if_not_abnormal_user – --是否非异常用户,1是,null异常用户或无试听下载记录的用户
if_pt_user --是否白金会员,1是,0否
留存率=留存人数/新用户数
参考代码:
SELECT COUNT(DISTINCT(CASE WHEN if_1_lc=1 THEN msisdn END )),
COUNT(DISTINCT(CASE WHEN if_7_lc=1 THEN msisdn END )),
COUNT(DISTINCT(CASE WHEN if_30_lc=1 THEN msisdn END )),
COUNT(DISTINCT (CASE WHEN if_new_user=1 then msisdn END))
FROM hr_dmrt_client_user_profile_sum
WHERE if_not_abnormal_user=1
AND if_pt_user=1
解释: 提取2018年1月至2018年6月白金会员新用户(且真实用户)的留存率
3.2 指定条件提取优质用户数量
统计口径:hr_dmrt_client_user_profile_sum –6个月大宽表数据汇总表
listen_cnt --试听次数
qq_download_cnt --全曲下载次数
mv_cnt --MV观看次数
concert_cnt --演唱会观看次数
share_cnt --分享次数
参考代码:
–按条件将每个用户的得分计算出
CREATE TABLE tmp_goodusers_m1 AS
SELECT msisdn ,concert_cnt*6.2+mv_cnt*2.2+qq_download_cnt*1.7+listen_cnt*0.8+share_cnt*147 AS record
FROM migu.hr_dmrt_client_user_profile_sum
--统计符合条件的用户数
SELECT COUNT(DISTINCT(msisdn))
FROM tmp_goodusers_m1
WHERE record>=30
解释:将观看演唱会,听歌,观看MV,下载,分享等行为按一定比例计分,总分大于等于30分则看做是客户端优质用户
3.3 查询各渠道非真实用户占比
统计口径: hr_dmrt_client_user_profile_sum –6个月大宽表数据汇总表
chn_id --渠道来源ID
channel_name --渠道名
非真实用户占比=使用时长为0的用户数/使用时长大于等于0的用户数
参考代码:
SELECT chn_id,channel_name,user_fake/user_all as ratio
FROM
(SELECT chn_id,channel_name,
COUNT(DISTINCT( CASE WHEN period=0 THEN msisdn end)) as user_fake,
COUNT(DISTINCT( CASE WHEN period>=0 THEN msisdn end)) as user_all
FROM migu.hr_dmrt_client_user_profile_sum
GROUP BY chn_id,channel_name) a
ORDER BY ratio DESC
LIMIT 10
解释:提取出非真实用户占比最多的前10个渠道
3.4 新增彩铃包月用户
统计口径:dmrt_client_user_profile_201802 --2月宽表数据
dmrt_client_user_profile_201801–1月宽表数据
if_cring_by_user --是否彩铃包月用户,1是,0否
新增定义:次月未开通,本月开通算新增
参考代码:
方法一:
SELECT DISTINCT( COUNT (A.msisdn) )FROM dmrt_client_user_profile_201802 AS A
WHERE A.if_cring_by_user = 1
AND NOT EXISTS( SELECT B. msisdn FROM dmrt_client_user_profile_201801 AS B
WHERE A. msisdn=B. msisdn and B.if_cring_by_user = 1)
方法二:
#次月新增用户开通彩铃包月人数
SELECT COUNT(DISTINCT(A.msisdn))
FROM dmrt_client_user_profile_201802 AS A
LEFT JOIN dmrt_client_user_profile_201801 AS B
ON A. msisdn=B. msisdn
WHERE A.if_cring_by_user = 1
AND B. if_cring_by_user IS NULL
#老用户在本月新开彩铃包月人数
SELECT COUNT(DISTINCT(A.msisdn))
FROM dmrt_client_user_profile_201802 AS A
LEFT JOIN dmrt_client_user_profile_201801 AS B
ON A. msisdn=B. msisdn
WHERE A.if_cring_by_user = 1
AND B. if_cring_by_user =0
解释: 选用两种方法,方法一为直接统计1月未开通,2月开通的彩铃包月人数
方法二则统计新用户新开的彩铃包月+老用户在本月开通的
宽表中的是否为新用户字段的意义是六个月未登录客户端的用户称为新用户
因此在上述代码中不能直接用if_new_user字段