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

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

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

SELECT COUNT(DISTINCT CASE WHEN 时间间隔=1 THEN B ELSE NULL END)/COUNT(DISTINCT B) AS avg_ret
FROM(SELECT a1.device_id,a1.date,CONCAT(a1.device_id,a1.date) as B,TIMESTAMPDIFF(DAY,a1.date,a2.date)AS 时间间隔
    FROM question_practice_detail as a1
    LEFT JOIN question_practice_detail as a2
    ON a1.device_id = a2.device_id) ba;

不想使用JOIN 和LEFT JOIN的解法,考虑使用CASE WHEN 来解决,但在讨论和解法中没有找到,所以自己研究了一个。

子查询中添加的B列(即CONCAT列)是因为我最开始犯的错误,请看我下面的代码:

SELECT COUNT(DISTINCT CASE WHEN 时间间隔=1 THEN device_id ELSE NULL END)/COUNT(DISTINCT device_id) AS avg_ret

FROM(SELECT a1.device_id,a1.date,TIMESTAMPDIFF(DAY,a1.date,a2.date)AS 时间间隔

FROM question_practice_detail as a1

LEFT JOIN question_practice_detail as a2

ON a1.device_id = a2.device_id) ba;

这样输出的结果是0.5,我去掉了COUNT的查询,输出了device_id,发现输出的是四个没有重复的device_id,即以上代码解决的是“有过第二天使用的用户占比”,代码不算错误,但跟题目的要求不符。题目想要计算的是:当天去重,但隔天不去重的用户使用记录在总的记录中(总记录依然是当天去重,隔天不去重)的占比。

所以如果直接DISTINCT device_id,输出的就是不重复的device_id,为了使得device_id加上日期标识,需要使用CONCAT函数给device_id联合date,我命名为B列,然后针对B列计数,就得到了题目要求。

纪念一下,读题+解题花了好几个小时,一直在找问题,最后发现题干读错了...

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

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