MySQL:《学习笔记与实战》之连表查询(1)周报提数

实习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逐级递减去重。

        

二、818营销活动艺人粉丝数

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 '%蔡依林%'

  OR   singer_nam like '%朴树%'  

  OR   singer_nam like '%迪玛希%'

  OR   singer_nam like '%徐佳莹%'

  OR   singer_nam like '%郭顶%'

  OR  singer_nam like '%阿肆%'

  OR   singer_nam like '%李剑青%'

  OR   singer_nam like '%金玟岐%'

  OR  singer_nam like '%鹿先森乐队%';

 

取听过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) = 11 THEN 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字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值