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

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

http://www.nowcoder.com/questionTerminal/ea0c56cd700344b590182aad03cc61b8

这个题目如果你做过牛客每个人最近的登录日期(三)和牛客每个人最近的登录日期(四),那么解决起来会容易很多,做过(四)https://blog.nowcoder.net/n/a2f955514f824bb888f9d7726421e809我们知道每个日期的新用户求法为:
select login.date,ifnull(n1.new_num,0)
from login 
left join 
(select l1.date,count(distinct l1.user_id) as new_num
from login l1
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date) n1
on login.date = n1.date
group by login.date
做过(三) https://blog.nowcoder.net/n/1dad24440b3e45949dfda03cb1f06a9e的话,我们可以轻松得到每个日期新用户次日还登录的人的个数的sql语句如下:
select l1.date,count(distinct l1.user_id)
from login l1
join login l2 on l1.user_id=l2.user_id and l2.date=date((l1.date),'+1 day') 
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date;
得到的结果如下:
2020-10-12|2
2020-10-14|1
又在(四)里面提到过联立主表,将查询次日还登录的人的sql也联立主表:
(select login.date,ifnull(n1.new_num,0) as second_login_num
from login 
left join 
(select l1.date,count(distinct l1.user_id) as new_num
from login l1
join login l2 on l1.user_id=l2.user_id and l2.date=date((l1.date),'+1 day') 
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date) n1
on login.date = n1.date
group by login.date) second_login
就可以得到:
2020-10-12|2
2020-10-13|0
2020-10-14|1
2020-10-15|0
的结果了,然后将这2个表联立相除,得到的结果保留3为,用ifnull判断0/0的情况,那么就可以得到完整结果了:
select second_login.date, round(ifnull(second_login.second_login_num *1.0/ first_login.first_num,0),3)
from (select login.date,ifnull(n1.new_num,0) as second_login_num
from login 
left join 
(select l1.date,count(distinct l1.user_id) as new_num
from login l1
join login l2 on l1.user_id=l2.user_id and l2.date=date((l1.date),'+1 day') 
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date) n1
on login.date = n1.date
group by login.date) second_login

join 

(select login.date,ifnull(n1.new_num,0) as first_num
from login 
left join 
(select l1.date,count(distinct l1.user_id) as new_num
from login l1
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date) n1
on login.date = n1.date
group by login.date) first_login

on second_login.date=first_login.date





全部评论
提个建议,看了几次你的解答了,能不能解题的时候标上序号吖,这样看着也清楚一点儿,不然这么长步骤看着乱乱的不是;还有表别名不是很清楚有点乱的感觉,直接类似于a,b,c这种简单的不挺好的
1 回复 分享
发布于 2021-07-17 11:26
这分析能力也很强啊
点赞 回复 分享
发布于 2020-09-14 17:49
太强了,一环扣一环,而且又很清晰,我什么时候能独立写出这种代码来呀
点赞 回复 分享
发布于 2020-09-08 11:01

相关推荐

评论
21
3
分享

创作者周榜

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