首页 > 试题广场 >

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

[编程题]计算用户的平均次日留存率
  • 热度指数:396720 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的留存率。请你取出相应数据。

示例:question_practice_detail
id device_id question_id result date
1 2138 111 wrong 2021-05-03
2 3214 112 wrong 2021-05-09
3 3214 113 wrong 2021-06-15
4 6543 111 right 2021-08-13
5 2315 115 right 2021-08-13
6 2315 116 right 2021-08-14
7 2315 117 wrong 2021-08-15
8 3214 112 wrong 2021-05-09
9 3214 113 wrong 2021-08-15
10 6543 111 right 2021-08-13
11 2315 115 right 2021-08-13
12 2315 116 right 2021-08-14
13 2315 117 wrong 2021-08-15
14 3214 112 wrong 2021-08-16
15 3214 113 wrong 2021-08-18
16 6543 111 right 2021-08-13

根据示例,你的查询应返回以下结果:
avg_ret
0.3000
示例1

输入

drop table if  exists `question_practice_detail`;
CREATE TABLE `question_practice_detail` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL,
`date` date NOT NULL
);

INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong','2021-05-03');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong','2021-05-09');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong','2021-06-15');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right','2021-08-14');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(8,3214,112,'wrong','2021-05-09');
INSERT INTO question_practice_detail VALUES(9,3214,113,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(10,6543,111,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(11,2315,115,'right','2021-08-13');
INSERT INTO question_practice_detail VALUES(12,2315,116,'right','2021-08-14');
INSERT INTO question_practice_detail VALUES(13,2315,117,'wrong','2021-08-15');
INSERT INTO question_practice_detail VALUES(14,3214,112,'wrong','2021-08-16');
INSERT INTO question_practice_detail VALUES(15,3214,113,'wrong','2021-08-18');
INSERT INTO question_practice_detail VALUES(16,6543,111,'right','2021-08-13');

输出

avg_ret
0.3000
头像 webary
发表于 2021-09-03 13:45:36
精华题解 题意明确: 用户在某天刷题后第二天再来刷题的平均概率 问题分解: 限定条件:第二天再来。 解法1:表里的数据可以看作是全部第一天来刷题了的,那么我们需要构造出第二天来了的字段,因此可以考虑用left join把第二天来了的拼起来,限定第二天来了的可以用date_add(date1, interv 展开全文
头像 牛客题解官
发表于 2025-02-14 14:32:15
精华题解 题目描述 运营团队希望查看用户在某天刷题后第二天是否会继续刷题的留存率。具体来说,计算所有用户在某天进行刷题活动后,第二天还进行刷题的用户比例,并求其平均值。需要从 question_practice_detail 表中提取相关数据,最终返回平均留存率 avg_ret,结果保留四位小数。 解题思路 展开全文
头像 Reg333
发表于 2021-10-01 15:33:18
题解:计算用户的平均次日留存率 题目分析 所谓次日留存,指的是同一用户(在本题中则为同一设备,即device_id)在当天和第二天都进行刷题。注意,在这题我们不关心同一用户(设备)在这天答了什么题、答题结果如何,只关心他是否答题,因此对于这题来说存在重复的数据(如下图红框所示),需要使用 DISTI 展开全文
头像 牛客182179768号
发表于 2021-09-23 11:52:50
思路:平均次日留存率=次日留存用户数/对应的当日用户数第一,对现有关系数据表的列进行拆解重构,目的是实现当日用户与次日用户的对应匹配,通过对question_practice_detail表利用from ...left outer join ... on ...建立自联结,这里重点指出通过on q1 展开全文
头像 铁胆野鸡
发表于 2021-09-12 16:55:04
这道题的有趣之处在于,之前的解题思路一般是一般是开局多张表,以“你希望看到怎样一张最终表”入手,多表归一得到最终表后解决。而这次就一张表,2个有效变量,人id,答题时间,问题不在信息没汇总,而在于汇总过度,需要先将其先分裂再归一,才能得到真正的最终表 先考虑如何得到第二天来作题的人的数据,一个错误思 展开全文
头像 小马仔仔
发表于 2022-02-24 16:50:37
第二天的有效访问人数 / 第一天的访问人数 用两次子查询,获得第一天的访问人数和第二天的访问人数,要去重 用时间函数date_add(date,interval *间隔次数* *时间单位*)获得隔天的访问数,赋值给第二天 select count(q2.device_id) 展开全文
头像 DraonAbyss
发表于 2021-10-08 01:29:40
知识 外连接 只限制一张表中的数据必须满足连接条件,而另一张表中数据可以不满足连接条 件。 外连接的语法格式为: SELECT … FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON <连接条件> left join: 包含左表的所有行,对应的右表行可能 展开全文
头像 牛客599169850号
发表于 2022-01-14 23:33:44
思路分析 对于这道题,由于题目没有给公式,题意也比较模糊,我们需要先猜出计算式,突破点是题目的示例数据,以及示例答案0.3。 题目是这样描述的: 现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率 我们可以用用频率(次数)代替概率,我们先猜测这个平均概率的计算式为 avg_ret=第二 展开全文
头像 冷凡社长
发表于 2022-07-15 15:59:35
select round(count(distinct t1.device_id,t1.date)/count(distinct t.device_id,t.date),4) as avg_ret from question_practice_detail t left join question 展开全文
头像 东陌寒
发表于 2021-10-22 14:54:26
select count(q2.device_id)/count(q1.device_id) as avg_ret from (select distinct device_id,date from question_practice_detail) as q1 left join (selec 展开全文
头像 一只小牛牛🙈
发表于 2022-02-10 16:26:49
使用窗口函数,应该是最简单的,lead偏移函数 SELECT SUM(IF(lead3=1,1,0))/COUNT(device_id) FROM (SELECT device_id, date, lead(date,1) over(PARTITION BY device_id ORDER BY 展开全文
头像 牛niu89757
发表于 2021-10-23 11:38:17
这个题目是:计算用户第二天来刷题的平均数. 要注意的是,要的不是曾经有过第二天来刷题的用户的占比,而是要累计的占比. 假设只有一个用户A, 第1天来刷题, 第2天来刷题, 第3天没有 那么,第二天来刷题的留存率是50% 而不是100%. 所以在用join表确认第二天来刷题的明细之后, 不能用 COU 展开全文