【已解决】数据库常见场景应用计算次日留存率

记录一个数据库中常见的应用场景,需要计算用户次日留存率(次留分析),查询出计算的用户留存率。

结合这个应用背景,牛客网站上的 SQL29 计算用户的平均次日留存率 非常适合拿来练习,下面就以牛客上的这道题目作为示例。

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

示例:question_practice_detail

iddevice_Idquest_idresultdate
12138111wrong2021-05-23
23214112wrong2021-05-09
33214113wrong2021-06-15
46543111right2021-08-13
52315115right2021-08-13
62315116right2021-08-14
72315117wrong2021-08-15

根据示例,查询应返回以下结果:

avg_ret
0.3000

解决方案

  1. 限定条件:首先将表里的数据看作全部都是第一天来刷题的,之后只要构造出第二天来的字段,因此可以考虑使用 left join 把第二天来了的拼接起来,限定第二天来了的可以用 date_add(date1, interval 1 day) 筛选,并用 device_id 限定是同一个用户。

  2. 平均概率:可以使用 count(date1) 得到左表全部的 date 记录数作为分母,count(date2) 得到右表关联上了的 date 记录数作为分子,相除即可得到平均概率。

注意事项

  • 表头重命名:as
  • 去重:需要按照 devece_id, date 去重,因为一个人同一天可能来多次,但是只需要记录一次用户来过的记录即可
  • 子查询必须全部有重命名:尽管可能不会在最终的查询字段中用到,但是必须要写,这是语法规定!

查询代码如下:

select count(date2) / count(date1) as avg_ret
from (
    select
        distinct qpd.device_id,
        qpd.date as date1,
        uniq_id_date.date as date2
    from question_practice_detail as qpd
    left join(
        select distinct device_id, date
        from question_practice_detail
    ) as uniq_id_date
    on qpd.device_id=uniq_id_date.device_id
        and date_add(qpd.date, interval 1 day)=uniq_id_date.date
) as id_last_next_date
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ReadThroughLife

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

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

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

打赏作者

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

抵扣说明:

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

余额充值