SQL68 牛客每个人最近的登录日期(三)

本文解析了一道关于计算SQL中新用户次日登录留存率的题目,通过理解新登陆用户和留存率的概念,利用去重和日期条件筛选,展示了如何使用COUNT和DATE_ADD函数实现结果。关键在于理解分母和分子的计算方法,并注意数据类型的转换。

文章目录

有点难度的题目,需要多练习。

1. 题目

  • 题目来源:SQL68 牛客每个人最近的登录日期(三)

  • 题目描述
    查询新登录用户次日成功的留存率,即第1天登陆之后,第2天再次登陆的概率,保存小数点后面3位(3位之后的四舍五入)

  • 一张表
    在这里插入图片描述

  • 所需结果
    在这里插入图片描述

2. 题解

思考:
首先,要理清两个概念:新登陆用户和留存率
先看最后的所求的留存率,

①【留存率】
新增用户次日的留存率 = 新增用户次日还登陆的总数 / 新增用户总数

②【新登录用户】
根据留存率的定义,可以知道这里并不需要知道具体的新登陆用户名和新登陆的日期,而只需要计算新登陆用户的总数和新登陆用户次日登陆的总数,是一个总数的问题
所以其实直接可以用去重后的登陆总数来表示新登陆用户的总数。

然后问题的核心就集中在了,如何表示新登陆用户次日还登陆的总数。

新登陆用户在第二天依然登陆,表示(user_id, current_date + 1) 这两个字段在表格中,其中user_idcurrent_date分别表示新登陆用户和登陆时间。

题解如下:

SELECT ROUND(COUNT(DISTINCT user_id) * 1.0 / (
                                              SELECT COUNT(DISTINCT user_id)
                                              FROM login)
             , 3)
FROM login
WHERE (user_id, date) IN (SELECT user_id, DATE_ADD(MIN(date), INTERVAL 1 DAY)
                          FROM login
                          GROUP BY user_id);

上述分母部分就是所有去重后的用户数量,分子部分是筛选出满足【新登陆用户在第二天依然登陆】添加的行。
注:乘以1.0是 强制转换数据为float类型,防止有些平台出问题。

(期初对这种代码结构也觉得诧异,但是后来想通了,因为分母部分就是一个确定的数字,把它当做常量即可。其它剩余部分就是一个完整地查询语句)

如果第一次做,还是有些难度的,很难想到这种处理方式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值