【SQL 02 计算用户的平均次日留存率】

题目描述

现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。

问题联系记录表 question_practice_detail:
iddevice_idquest_idresultdate
12138111wrong2021-05-03
23214112wrong2021-06-10
36543113right2021-06-15
42316116right2021-05-13
5217118right2021-08-13
最终输出样式:
avg_ret
0.3000

题目分析

所谓次日留存,指的是同一用户(在本题中则为同一设备,即device_id)在当天和第二天都进行刷题。注意,在这题我们不关心同一用户(设备)在这天答了什么题、答题结果如何,只关心他是否答题,因此对于这题来说存在重复的数据(如下图红框所示),需要使用 DISTINCT 去重。
而次日留存率可以这样表示:

次日留存率=去重的数据表中符合次日留存的条目数目 / 去重的数据表中所有条目数目

具体而言,使用两个子查询,查询出两个去重的数据表,并使用条件(q2.date应该是q1.date的后一天)进行筛选,如下所示(数据未显示完全,从左至右顺序,列表名为 q1.device_id, q1.date, q2.device_id, q2.date)

因为使用的是q1左联q2,所以q1的所有信息是显示的;而q2中只显示留存的信息,否则为null。
最后,分别统计q1.device_id 和 q2.device_id 作去重后的所有条目数和去重后的次日留存条目数,即可算出次日留存率.

SQL实现

SELECT
    COUNT(q2.device_id) / COUNT(q1.device_id) AS avg_ret
FROM
    (SELECT DISTINCT device_id, date FROM question_practice_detail)as q1
LEFT JOIN
    (SELECT DISTINCT device_id, date FROM question_practice_detail) AS q2
ON q1.device_id = q2.device_id AND q2.date = DATE_ADD(q1.date, interval 1 day)

Tip:MySQL中 COUNT在对列进行计数时不统计值为 null的条目

Knowledge Point 知识点

1.MySQL DATE_ADD() 函数

定义:DATE_ADD() 函数向日期添加指定的时间间隔
语法:DATE_ADD(date,INTERVAL expr type)

date 参数是合法的日期表达式。
expr 参数是您希望添加的时间间隔。
type 参数是时间单位。

type 参数可以是以下值:

Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
2.MySQL COUNT 函数

COUNT(*) 函数返回在给定的选择中被选的行数。
COUNT(column_name) 函数返回指定列的值的数目(NULL 空值不计入)

Reference

牛客网练习
SQL在线速查手册

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eason DayDayUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值