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

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

https://www.nowcoder.com/practice/e524dc7450234395aa21c75303a42b0a

这个题目做过前面的题的话,应该可以比较容易就知道,
1
2
3
select l1.date,count(distinct l1.user_id)
from login l1
group by l1.date;
这样可以得到每个日期里面,用户登录的数目,比较简单,所以在加一个where判断条件就能从这每个日期里面,用户登录的数目取出哪些是新用户,如下:
1
2
3
4
5
select l1.date,count(distinct l1.user_id)
from login l1
where l1.date =
(select min(date) from login where user_id=l1.user_id)
group by l1.date;
当这个日期,正好是这个用户登录的最小日期,而且用户id相同时,那么肯定就是这个日期登录的新用户,执行的用例的话,得到的结果应该如下:
1
2
2020-10-12|3
2020-10-14|1
但是这样并不能通过用例,因为这样的话,2020-10-13没有新用户登录,应该输出为0的,这个语句却没有输出。但是login表的日期是完整的,所以我们考虑将login表当主表,上面查出来的表左连接到主表,顺序输出,并使用ifnull语句将null变成0,最后再加上一个order by语句,就可以得到题目想要的结果了:
1
2
3
4
5
6
7
8
9
10
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 order by login.date

借鉴下他人的mysql使用窗口函数的写法:(mysql8.0里面rank是关键字,不能直接使用)
1
2
3
4
5
6
select a.date,
sum(case when t_rank=1 then 1 else 0 end) new
from 
(select date, row_number() over(partition by user_id order by date) t_rank
from login) a
group by date;
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务