题解 | #计算用户的平均次日留存率#
计算用户的平均次日留存率
https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453
select sum(d.isCome) / count(1) as avg_ret from ( select c.device_id, c.`date`, case when sum(c.nextCome) = 0 then 0 else 1 end as isCome from ( select a.device_id, a.`date`, ( case when b.id is not null then 1 else 0 end ) as nextCome from question_practice_detail a left join question_practice_detail b on date_add(a.`date`, interval 1 day) = b.`date` and a.device_id = b.device_id ) c group by c.device_id, c.`date` ) d
开始的思路,所以记录按照device_id 和date去个重得到a,再自连接 a得到 是否接着下一天刷题了,但是感觉这样写没有难度,所以就使用了下面这种思路,下面这种思路关键就是去重需要墨迹墨迹一下。应该可以优化,暂时这样
第一层,自连接,吧和自己相邻的下一天找到
第二层,主要是去重。一个用户在某一天有多条记录,利用device_id,date去重
第三层,做统计,被除数是第二天还回来的记录个数,除数是(device_id,date)记录个数(用户id 和日期绑定做一个主键),刚开始我误以为除数是用户的数量,count 中加了一个distinct 但是不正确,所以应该是记录数量
还有一种思路,开窗,应该也可以,mysql8看了看资料应该可以开窗