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

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

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-04 21:17
江南大学 Java
穷哥们想卷进大厂:肯定会问技术呀,面试你的可能是别人
点赞 评论 收藏
分享
双非一本失业第二年:《机器视觉垃圾分类》
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务