题解 | #计算用户的平均次日留存率#

计算用户的平均次日留存率

https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453

SELECT AVG(if(DATEDIFF(date2, date1)= 1,1,0)) as avg_ret
FROM
(
    SELECT device_id, date as date1,
    LEAD(date) OVER 
    (
        PARTITION BY device_id 
        ORDER BY date
    ) as date2 --当前活跃日的后一个活跃日
    FROM
    (
        SELECT distinct device_id, date 
        FROM question_practice_detail
    )uniq --去除同一天多次答题的重复数据
)final

思路

  1. 一个用户可能在同一天有多条答题记录,而我们只关心是否答题,因此需要构造uniq表代表该用户当天是否答题;
  2. 次日留存率 = 在基准天的第二天答题的用户数 / 基准天答题的用户数,计算方法可分为两种情况:
  • 仅考虑新用户的留存率,则用COUNT函数分别计算分子和分母,其中分母要保证是新用户(第一条记录);
  • 需要考虑所有用户的留存率,则直接用AVG函数对基准日求平均留存率,因为对分母没有任何限制(所有记录),分子是记录次日是否活跃的0-1布尔变量。

Q:为什么AVG(if(DATEDIFF(date2, date1)= 1,1,0))即为平均留存率?

A: IF(DATEDIFF(date2, date1)=1, 1, 0)返回的是一个0-1序列,例如:用户1:[0,1,1],对其求AVG的结果 = 元素之和/元素总数,即2/3,因此可以直接得到平均次日留存率(留存为1,不留存为0)

知识点

  1. IF(exp, a, b):如果exp为真则=a,否则=b;
  2. LEAD(column)OVER(PARTITION BY group, ORDER BY date):取按group分组、按date降序排列的下一条column记录。
#SQL进阶##数分##牛客创作赏金赛##我的实习日记#
全部评论

相关推荐

黑曼巴在线招人:草拟
点赞 评论 收藏
分享
也许是天气_:实习这块全是假大空像AI生成的,没有实际内容。要体现出难点、亮点、解决问题的过程
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务