题解 题目定义有问题没,我按照常用的次日留存率定义算了一下

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

https://www.nowcoder.com/practice/126083961ae0415fbde061d7ebbde453

 # with

#     tep as (

#         select

#             device_id,

#             date,

#             lead(date) over (

#                 partition by

#                     device_id

#                 order by

#                     date

#             ) as nextdate

#         from

#             (

#                 select distinct

#                     device_id,

#                     date

#                 from

#                     question_practice_detail

#                 order by

#                     date

#             ) t

#     )

# SELECT

#     ROUND(

#         COUNT(

#             distinct CASE

#                 WHEN DATEDIFF(nextdate, date) = 1 THEN device_id

#             END

#         ) / COUNT(distinct device_id),

#         4

#     ) AS avg_ret

# FROM

#     tep;

WITH first_day AS (

    SELECT device_id, MIN(date) AS first_date

    FROM question_practice_detail

    GROUP BY device_id

),

next_day AS (

    SELECT

        f.device_id,

        f.first_date,         -- 这里必须返回 first_date

        MIN(q.date) AS next_date

    FROM first_day f

    LEFT outer JOIN question_practice_detail q

        ON f.device_id = q.device_id

       AND q.date > f.first_date

    GROUP BY f.device_id, f.first_date

)

SELECT

   

        round(COUNT(CASE WHEN DATEDIFF(next_date, first_date) = 1 THEN device_id END)

        / COUNT(*),4) AS avg_ret

FROM next_day;

全部评论

相关推荐

做个有文化的流氓:Offer收割机
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务