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

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

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

思路:平均次日留存率=次日留存用户数/对应的当日用户数
第一,对现有关系数据表的列进行拆解重构,目的是实现当日用户与次日用户的对应匹配,通过对question_practice_detail表利用from ...left outer join ... on ...建立自联结,这里重点指出通过on q1.device_id=q2.device_id and datediff(q2.date,q1.date)=1实现联结匹配,datediff(次日,当日)=1即次日-当日=1(相隔一天)发挥构建桥梁作用;
第二,分母count(distinct q1.device_id,q1.date) 通过DISTINCT 对当日的device_id,date进行双项剔重,利用COUNT()统计用户数;同样的分子count(distinct q2.device_id,q2.date)对次日的device_id,date进行双项剔重。

SELECT count(distinct q2.device_id,q2.date)/count(distinct q1.device_id,q1.date) as avg_ret
FROM question_practice_detail as q1 left outer join question_practice_detail as q2 
on q1.device_id=q2.device_id and datediff(q2.date,q1.date)=1;
全部评论
我觉得“平均”这个概念没有表达出来,平均只能站在独立用户的角度下,计算每个用户的留存率,然后平均。而代码中只是计算了留存率,即10种答题模式(count(distinct device_id,date),按照排列组合理解)中,只有3种属于留存的模式,0.3的计算结果是系统对用户第二天还会再来的留存率,而非“用户第二天还会再来的平均概率”
11 回复 分享
发布于 2021-09-27 16:32
大佬为什么count distinct后面能放两个列呢?count后面应该只能放一列呀
3 回复 分享
发布于 2024-06-26 17:32 北京
第一种解法看了半天没看明白,你的解法言简意赅,最简约
3 回复 分享
发布于 2022-08-01 17:12
求助大神为什么这个解法不是这样啊? select count(distinct q2.device_id,q2.date)/count(distinct q1.device_id,q1.date) avg_ret from question_practice_detail q1 left join question_practice_detail q2 on q1.device_id=q2.device_id where q1.device_id=q2.device_id and datediff(q1.date,q2.date)=1
2 回复 分享
发布于 2022-12-27 19:11 四川
为啥不能内连接,两个相同的表内连接有啥问题呀
1 回复 分享
发布于 2024-10-19 18:43 广西
大佬!您就是最强的!%%%
点赞 回复 分享
发布于 01-02 18:28 广东
能问问 left join 和left outer join 的区别吗,我搜着说没区别又看有人说面试官问两个的区别
点赞 回复 分享
发布于 2024-12-19 13:52 山东
为什么chatgpt上,说,这样写有问题呢
点赞 回复 分享
发布于 2024-05-24 17:39 河南
想请教大家一个问题,就是q1\q2不都是question_practice_detail表吗?为什么还取值不同?连接之后得到的是新表呀,怎么影响的q2的取值?
点赞 回复 分享
发布于 2023-08-10 15:43 上海
为啥要双项剔重呀
点赞 回复 分享
发布于 2022-09-16 21:21 北京
666,大佬请收我为手下
点赞 回复 分享
发布于 2022-08-09 21:46
言简意赅👍
点赞 回复 分享
发布于 2022-06-03 16:31
最简约的做法
点赞 回复 分享
发布于 2022-05-16 14:56
select count(distinct q1.device_id)/count(distinct q2.device_id) as again_rate from question_practice_detail q1 left join question_practice_detail q2 on q1.device_id=q2.device_id and q1.date=date_add(q2.date,interval 1 day); 请教:为什么这么写算不出来呢
点赞 回复 分享
发布于 2022-03-12 19:33

相关推荐

强大的马里奥:不太可能,我校计算机硕士就业率99%
点赞 评论 收藏
分享
评论
186
21
分享

创作者周榜

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