题解 | #计算用户的平均次日留存率#
计算用户的平均次日留存率
https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453
select count(distinct q.device_id,q.date) / (select count(distinct device_id,date) from question_practice_detail) as avg_ret from question_practice_detail q join question_practice_detail qt on q.device_id = qt.device_id and adddate(q.date, interval 1 day) = qt.date;
这里我们可以用最简单的方式:
这里有一个隐藏的问题就是一个用户(device_id)在同一天刷了多题,在计算第二天回刷题目概率时,要把这部分数据distinct一下。
可以想象一个当表中只有A和B两个用户,他们都在'2022-02-02'这一天刷了题。A刷了一题,B刷了100题,B用户在
'2022-02-03'这一天刷了题而A用户没有刷,如果不distinct一下的话,我们算出来回刷率高达99%,而实际的回刷率应该是50%(这也就解释了为什么要distinct)
SQL书写方式是
1.先是用inner join自联结限定device_id相等,date互相差一天,并且把符合结果的数据集按照device_id和date来distinct一下将结果集作为分子
2.再直接从表中select count(disctint device_id,date) from question_practice_detail作为分母
答毕。