题解 | 牛客每个人最近的登录日期(三)

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

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 总和就是在次日成功留存的用户总数

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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