题解 | 牛客每个人最近的登录日期(三)
牛客每个人最近的登录日期(三)
https://www.nowcoder.com/practice/16d41af206cd4066a06a3a0aa585ad3d
select
round(sum(case when l2.date = date_add(l1.date,interval 1 day) then 1 else 0 end)/count(distinct l1.user_id),3) as p
from
(select user_id,min(date) as date from login group by user_id)l1
join
login l2
on l1.user_id = l2.user_id
子查询
select user_id,min(date)
from login
group by user_id
group by 对用户进行分组 如果不分组 会返回整个 login 表中所有记录里最早的那个日期,而不是每个用户各自的最早日期
表连接
join
login l2
on l1.user_id = l2.user_id
当你需要从同一个表中获取不同条件的数据时(比如 “用户首次登录记录” 和 “用户次日登录记录”),就必须将这个表 “伪装成两个独立的表” 来处理 —— 这就是 自连接
此时给每个 “伪装表” 起一个简短的别名(比如 l1、l2),数据库才能区分:你引用的 user_id 是来自 “第一个伪装表”,还是 “第二个伪装表”。
select
round(sum(case when l2.date = date_add(l1.date,interval 1 day) then 1 else 0 end)/count(distinct l1.user_id),3) as p
l2 表中的登录日期是否正好是 l1 表中 “首次登录日期” 的第二天。
如果是就是1 不是就返回0 总和就是在次日成功留存的用户总数。

