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

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

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看了看资料应该可以开窗

全部评论

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务