image.png
    image.png
    1.用户活跃模型表

    1. create table tmp_liujg_dau_based(
    2. imp_date varchar(20) not null comment '日期',
    3. qimei varchar(20) not null comment '用户唯一标识',
    4. is_new varchar(10) comment '新用户表示,1表示新用户,0表示老用户',
    5. primary key(imp_date,qimei));
    6. ALTER TABLE tmp_liujg_dau_based COMMENT '用户活跃模型表';

    2.红包参与领取模型表

    1. create table tmp_liujg_packed_based
    2. (
    3. imp_date varchar(20) comment '日期',
    4. report_time varchar(20) comment '领取时间戳',
    5. qimei varchar(20) not null comment '用户唯一标识',
    6. add_money varchar(20) not null comment '领取金额,单位为分');
    7. ALTER TABLE tmp_liujg_packed_based COMMENT '红包参与领取模型表';

    3.题目:

    1. 1、计算201961日至今,每日DAU(活跃用户量,即有登陆的用户)
    2. 2、计算20190601至今,每日领取红包的新用户数,老用户数,及人均领取金额,人均领取次数
    3. 3、计算20193月,每个月按领红包取天数为123……3031天区分,计算取每个月领取红包的用户数,人均领取金额,人均领取次数
    4. 4、计算20193月,每个月领过红包用户和未领红包用户的数量,平均月活跃天数(即本月平均活跃多少天)
    5. 5、计算20193月至今,每个月活跃用户的注册日期,201931日前注册的用户日期填空即可
    6. 6、计算20193月至今,每日的用户次日留存率,领取红包用户的次日留存,未领取红包用户的次日留存率
    7. 7、计算201961日至今,每日新用户领取得第一个红包的金额
    8. 8.计算201931日至今,每个新用户领取的第一个红包和第二个红包的时间差(只计算注册当日有领取红包的用户,注册当日及以后的DAU表中新用户为1的用户)

    1、计算2019年6月1日至今,每日DAU(活跃用户量,即有登陆的用户)

    1. select imp_date,count(distinct user_id) as dau
    2. from dau
    3. where imp_date>='2019-06-01'
    4. group by imp_date

    2、计算20190601至今,每日领取红包的新用户数,老用户数,及人均领取金额,人均领取次数

    1. select h.imp_date,
    2. count(distinct(case is_new when 1 then h.user_id else null end)) as '新用户数',
    3. count(distinct(case is_new when 0 then h.user_id else null end)) as '老用户数',
    4. sum(add_money)/count(distinct h.user_id) as '人均领取金额',
    5. count(*)/count(distinct h.user_id) as '人均领取次数'
    6. from hongbao h
    7. join dau d
    8. on h.user_id=d.user_id and h.imp_date=d.imp_date
    9. where imp_date >='2019-06-01'
    10. group by h.imp_date
    11. order by h.imp_date;

    5、计算2019年3月至今,每个月活跃用户的注册日期,2019年3月1日前注册的用户日期填空即可

    1. select user_id, min(imp_date)
    2. from dau
    3. where user_id in (
    4. select distinct user_id
    5. from dau
    6. where imp_date>='2019-03-01'
    7. )
    8. group by user_id;

    6、计算2019年3月至今,每日的用户次日留存率,领取红包用户的次日留存,未领取红包用户的次日留存率
    1)

    1. select d1.imp_date,
    2. count(distinct d2.user_id)/count(distinct d1.user_id),
    3. count(distinct(case when h.user_id is not null then d2.user_id else null))/count(distinct(case when h.user_id is not null then d1.user_id else null)),
    4. count(distinct(case when h.user_id is not null then d2.user_id else null))/count(distinct(case when h.user_id is not null then d1.user_id else null))
    5. from dau d1 left join dau d2
    6. on datediff(d2.imp_date,d1.imp_date)=1 and d1.user_id=d2.user_id
    7. left join hongbao h
    8. on d1.user_id=h.user_id
    9. group by d1.imp_date;

    2)在1)的前提下加满足条件:领红包日期<=登陆日期,才算领取红包用户

    1. select d1.imp_date,
    2. count(distinct d2.user_id)/count(distinct d1.user_id),
    3. count(distinct(case when min_hongbao_date<=d1.imp_date then d2.user_id else null))/count(distinct(case when min_hongbao_date<=d1.imp_date then d1.user_id else null)),
    4. count(distinct(case when min_hongbao_date>d1.imp_date then d2.user_id else null))/count(distinct(case when min_hongbao_date>d1.imp_date then d1.user_id else null))
    5. from dau d1
    6. left join dau d2
    7. on d1.user_id=d2.user_id and datediff(d2.imp_date,d1.imp_date)=1
    8. left join (
    9. select user_id,min(imp_date)as min_hongbao_date
    10. from hongbao
    11. group by user_id
    12. ) h
    13. on d1.user_id=h.user_id
    14. where year(d1.imp_date)=2019 and month(d1.imp_date)>=6
    15. group by d1.imp_date;

    7、计算2019年6月1日至今,每日新用户领取得第一个红包的金额

    1. select h.user_id,h.report_time,h.add_money
    2. from (
    3. select *,row_number()over(partition by user_id order by report_time) as flag
    4. from hongbao
    5. ) as h
    6. join dau d on d.user_id=h.user_id
    7. where year(d1.imp_date)=2019 and month(d1.imp_date)>=6 and d.is_new=1 and h.flag=1;

    8.计算2019年6月1日至今,注册的新用户领取的第一个红包和第二个红包的时间差
    思路1:

    1. select user_id,timestampdiff(second,min(report_time),max(report_time)) as interval
    2. from (
    3. select *,row_number()over(partition by user_id order by report_time) as flag
    4. from hongbao
    5. ) as h
    6. where user_id in (
    7. select user_id
    8. from dau
    9. where year(imp_date)=2019 and month(imp_date)>=6
    10. and is_new=1
    11. )
    12. and flag<=2
    13. group by user_id
    14. having min(report_time)<max(report_time)#筛选出至少领取2次的用户

    思路2:lead()得到时间差,但没有row number()无法得到第一个红包时间