牛客每个人最近的登录日期(三)题解

牛客每个人最近的登录日期(三)

http://www.nowcoder.com/questionTerminal/16d41af206cd4066a06a3a0aa585ad3d

要统计牛客新登录用户的次日成功的留存率,首先把公式列出来:
(第一天登录的新用户并且第二天也登录的用户)/(总用户)即为新登录用户的次日成功的留存率
总用户其实挺好算,如下:
select count(distinct user_id) from login
找到每个用户第一天登陆的日子,其实挺好找,和前面找最近登录的日子差不多,一个是max,一个是min:
select user_id,min(date) from login group by user_id
比如上面查找语句是1,2020-10-12;那么如果找到一个结果为1,2020-10-13的那么是不是就符合结果了,于是可以如下写:
select user_id,date(min(date),'+1 day') from login group by user_id
这样就可以找到所有的在第一天登录的新用户并且第二天也登录的用户,以及第二天的日期
所以从这个里面找到所有的count(distinct user_id)除以总用户就可以得到结果了,于是整个sql语句如下:
select 
round(count(distinct user_id)*1.0/(select count(distinct user_id) from login) ,3)
from login
where (user_id,date)
in (select user_id,date(min(date),'+1 day') from login group by user_id);

 
mysql的解法为:
select 
round(count(distinct user_id)*1.0/(select count(distinct user_id) from login) ,3)
from login
where (user_id,date)
in (select user_id,DATE_ADD(min(date),INTERVAL 1 DAY) from login group by user_id);



全部评论
请问一下这里的 *1.0 是什么作用?
11 回复 分享
发布于 2021-04-23 10:41
大佬,怎么想出来这么简洁优美的语句的!我想破我的脑瓜都没想出来-_-
10 回复 分享
发布于 2020-09-07 11:03
用户至少登录过一次,不然就不会存在第一天,count(distinct user_id)就是第一天的总用户数。
7 回复 分享
发布于 2021-03-06 10:33
你好,感谢解答。 分子中的distinct是冗余的
6 回复 分享
发布于 2020-08-31 10:25
说明一下“分母为什么是总用户”的问题,分子代表所有第一天登陆后第二天继续登录的用户很好理解,而分母是总用户的原因是:所有用户都有一个第一天登陆的时间,也许是11号也许是12号,因此用户第一天登陆时间是不同的,所以所谓第一天登陆过的用户数其实就是(11号初次登录+12号初次登录+...)看一看这不就是总用户数嘛
3 回复 分享
发布于 2021-09-22 17:51
请问,在哪里可以找到 WHERE IN 多条件带括号的简化写法的文章介绍?
3 回复 分享
发布于 2021-06-08 20:50
总用户是不是应该取第一天登陆的用户数呢,分母部分是不是不对呢:select count(distinct user_id) from login
3 回复 分享
发布于 2020-09-19 22:34
这个题这样写没啥问题,但是如果人家12号初次登录,13号没登,14,15连续登录呢?应该不行吧
1 回复 分享
发布于 2021-10-10 21:26
有问题的 用Min(date)锁定了第一次登录时间,可是用户完全可能是在之后才出现连续两日登录的 那么就会漏掉;
点赞 回复 分享
发布于 2023-03-28 11:41 北京
分子:第二天仍然登录的用户[用所有用户ID和DATE 匹配所有用户ID和DATE+1(初次登录日期+1),匹配出来的是第二天仍然登录的用户; ] 分母:所有用户去重求和; PS:感觉自己脑子不够用,看答案都看了半天。
点赞 回复 分享
发布于 2022-09-22 15:30 北京
请问这样解有问题吗? SELECT ROUND(COUNT(l1.user_id) * 1.0 / COUNT(l2.user_id), 3) AS p FROM (SELECT user_id, min(date) AS date FROM login GROUP BY user_id) AS l2 LEFT JOIN login AS l1 ON l1.user_id = l2.user_id AND l1.date = date(l2.date,'+1 day');
点赞 回复 分享
发布于 2022-01-07 22:33
一步一步分析这技巧实在太好了,简洁明了。
点赞 回复 分享
发布于 2021-10-14 13:57
冒昧的问一句,为什么要拿总用户,存活率不应该是拿第一天和第二天都登录的用户/第一天登录过的用户么
点赞 回复 分享
发布于 2021-09-09 15:08
前面都看得懂,(select count(distinct user_id) from login)是总用户,为什么round(count(distinct user_id)就是第一第二天都留存的用户啊,两个count(distinct user_id)不是一样的吗
点赞 回复 分享
发布于 2021-05-09 19:26
前面都看得懂,(select count(distinct user_id) from login)是总用户,为什么round(count(distinct user_id)就是第一第二天都留存的用户啊,两个count(distinct user_id)不是一样的吗
点赞 回复 分享
发布于 2021-05-09 19:26
前面都看得懂,(select count(distinct user_id) from login)是总用户,为什么round(count(distinct user_id)就是第一第二天都留存的用户啊,两个count(distinct user_id)不是一样的吗
点赞 回复 分享
发布于 2021-05-09 19:26
我想请教在where (user_id,date) in (select user_id,DATE_ADD(min(date),INTERVAL 1 DAY) from login group by user_id)这里把user_id去掉,为什么结果会变成0.75。。将user_id去掉后单独查询count后的答案都是1,为啥一进行round运算就会变成0.75,加上user_id就不会。。
点赞 回复 分享
发布于 2021-04-12 11:35

相关推荐

11-19 18:44
已编辑
成都理工大学 Java
程序员花海:我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
如何写一份好简历
点赞 评论 收藏
分享
牛客60022193...:大厂都招前端,他们觉得AI能替代前端,可能他们公司吊打btaj吧
点赞 评论 收藏
分享
评论
256
31
分享

创作者周榜

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