百度面SQL试题--求N日留存率

源数据

cuidevent_day
12020-04-01
22020-04-01
32020-04-01
12020-04-02
22020-04-02
52020-04-02
12020-04-08
22020-04-08
32020-04-08
32020-04-09

题目 

           求次日、七日的用户留存率

        给的数据中是没有重复数据的,但是当做这种题的时候我的第一反应就是要先去重,因为一个用户一天可能会登录多次,但是只能计数一次,因此我又自己给他加上了一条数据,这样可以将题目更加的完善。

12020-04-01

在做的时候我是分三步完成的:

1、去重 保证一天内没有重复登录的用户
2、选出 rn=1 即一天内只记录用户登录一次,在计算当天登录的用户、次日登录的用户、七日登录的用户
3、计算当天人数、次日人数、七日人数并求解

1、去重

        

select cuid, event_day,
       row_number() over(partition by cuid,event_day order by event_day) as rn1
from baidu

2、求解

select cuid, event_day,
       case
            when event_day = '2020-04-01' then 1
       end one
       ,
       case
            when (cuid,event_day) in (select cuid,date_sub(event_day,interval 1 day) from baidu) then 2
       end two
       ,
       case
            when (cuid,event_day) in (select cuid,date_sub(event_day,interval 7 day) from baidu) then 7
       end seven
from t1
where rn1 = 1 and event_day = '2020-04-01'

3、计算       

select event_day,  round(count(two) / count(one),3) as ciri,round(count(seven) / count(one),3) as qiri
from t2
group by event_day             

完整代码

with t1 as(select cuid, event_day,
       row_number() over(partition by cuid,event_day order by event_day) as rn1
from baidu)
,t2 as(select cuid, event_day,
       case
            when event_day = '2020-04-01' then 1
       end one
       ,
       case
            when (cuid,event_day) in (select cuid,date_sub(event_day,interval 1 day) from baidu) then 2
       end two
       ,
       case
            when (cuid,event_day) in (select cuid,date_sub(event_day,interval 7 day) from baidu) then 7
       end seven
from t1
where rn1 = 1 and event_day = '2020-04-01')
select event_day,  round(count(two) / count(one),3) as ciri,round(count(seven) / count(one),3) as qiri
from t2
group by event_day;

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangjiwei0207

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值