题解 | #牛客每个人最近的登录日期(五)#
牛客每个人最近的登录日期(五)
https://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8
- 首先将login第二天的数据通过user_id字段与今天的数据联结成一张表;
- 使用 l1.user_id not in (select user_id from login where date < l1.date) 条件筛除老用户;
- 计算出新用户的次日留存率,此时没有新用户登录即次日留存率为0的日期不会显示,所以还要通过union的方式将这部分数据补充上;
- 使用一个新的select语句,找出login表中新用户数量为0的日期,将次日留存率直接返回0.000;
- 最后按日期升序排列即可。
l1.id | l1.user_id | l1.client_id | l1.date | l2.id | l2.user_id | l2.client_id | l2.date |
1 | 2 | 1 | 2020-10-12 | 4 | 2 | 2 | 2020-10-13 |
2 | 3 | 2 | 2020-10-12 | None | None | None | None |
3 | 1 | 2 | 2020-10-12 | 5 | 1 | 2 | 2020-10-13 |
4 | 2 | 2 | 2020-10-13 | None | None | None | None |
5 | 1 | 2 | 2020-10-13 | None | None | None | None |
6 | 3 | 1 | 2020-10-14 | None | None | None | None |
7 | 4 | 1 | 2020-10-14 | 8 | 4 | 1 | 2020-10-15 |
8 | 4 | 1 | 2020-10-15 | None | None | None | None |
select *
from (
select
l1.date,
format (count(l2.user_id) / count(l1.user_id), 3)
from login l1
left join login l2 on l2.user_id = l1.user_id and datediff (l2.date, l1.date) = 1
where l1.user_id not in (select user_id from login where date < l1.date)
group by l1.date
union all
select
l1.date,
0.000
from login l1
where (
select count(*)
from login l2
where l2.date = l1.date and l2.user_id not in (select user_id from login where date < l1.date)
) = 0
group by l1.date
) t
order by t.date;
小天才公司福利 1173人发布
查看14道真题和解析