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

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

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

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






全部评论
窗口函数报错你们会吗?
1 回复 分享
发布于 2021-08-26 00:32
为什么子查询(select min(date) from login where user_id=l1.user_id)中的where user_id=l1.user_id这句可以实现在求min(date)时对date分组呀
点赞 回复 分享
发布于 2023-02-26 09:12 湖北
感谢,思路清晰很受启发
点赞 回复 分享
发布于 2022-03-15 11:05
为什么要用ifnull呢,count会对0值计算,这样ifnull计算的值不是有问题吗
点赞 回复 分享
发布于 2022-01-06 14:28
SELECT date,sum(r=1) new from (SELECT user_id,date, rank() over (partition by user_id order by date ) r from login) b group by date;
点赞 回复 分享
发布于 2021-07-30 17:20
select count( case when rank() over (partition by user_id order by date) = 1 then 1 end ) ,date from login group by date 也是用窗口函数的思路做的,这样为啥不行呢
点赞 回复 分享
发布于 2021-07-09 14:58
嗯,你这个答案,我完全看不懂
点赞 回复 分享
发布于 2021-04-17 13:45
请问第一种方法中的WHERE关联子查询中为什么不加GROUP BY user_id也不会报错呢?感觉加GROUP BY之后会更加严谨
点赞 回复 分享
发布于 2021-04-14 09:15

相关推荐

评论
72
6
分享

创作者周榜

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