抖音面试题:遇到连续问题怎么办?

【面试题】

有一张“用户登陆记录表”,包含两个字段:用户id、日期。

【问题】查询2021年每个月,连续2天都有登陆的用户名单。


【解题步骤】


1. 连续问题的万能模板

我在《拼多多面试题:如何找出连续出现N次的内容?》里讲过遇到“连续问题”如何解决,并送出了一个万能模板,模板使用的是窗口函数解决连续问题。

2. 窗口函数


窗口函数lead使用方法:

默认值是指:当向上N行或者向下N行值时,如果已经超出了表行和列的范围时,会将这个默认值作为函数的返回值,若没有指定默认值,则返回Null。

窗口函数lead可以获取每个字段的后面的第n个值,并生成新的一列。

而这道题描述的“用户连续登陆”中的“连续”可以理解为用户当前的登陆日期与本月下一次登陆日期相差一天。

我们可以先用窗口函数lead获取“用户当月下一个登陆日期”:


当“日期”是该用户在当月最后一天登陆时,记录为“当月最后登陆日期”,如果不进行设置,将会返回Null,不利于理解。


从结果看,我们可以获得以下信息:

1)当“日期”与“用户当月下一个登陆日期”只相差一天,即用户本次登陆为连续登陆;

2)当“日期”与“用户当月下一个登陆日期”相差大于一天,即用户本次登陆为连续登陆的最后一天(也有可能仅登陆一天);

3)当“用户当月下一个登陆日期”等于“当月最后登陆日期”,即用户本次登陆为本月最后一天登陆。


这样,可以判断用户连续登陆的情况。

接下来就解决用户每次连续登陆天数的计算。


3. 子查询

用户每次连续登陆天数与用户登陆顺序存在某种必然的关系,此时我们可以先用子查询将用户在本月的阅读顺序查询出来,使用窗口函数row_number:



可以看出,当连续终止时,即:

1)“日期”与“用户当月下一个登陆日期”相差大于一天;

2)“用户当月下一个登陆日期”等于“当月最后登陆日期”;


两种情况。

将这两种情况过滤出来之后,用户连续登陆天数为:当前登陆顺序减去上一个登陆顺序。



“上一个登陆顺序”为 Null 时,用0代替(使用coalesce函数),那么“每个月登陆顺序”减去“上一个登陆顺序”就是本次连续登陆天数。

过滤出最终结果:

【本题考点】

1.考查对窗口函数的了解

2.考查对子查询的了解

3.考查对连续问题的了解,可以套用万能模板


【举一反三】

【问题】查询2021年每个月,连续5天都有登陆的用户数。

与原题的区别在于:

1)“连续2天”变成了“连续5天”:对最后的where条件进行修改;

2)查询“用户名单”变成了“用户数”:用户group by和count(distinct 用户id)计算用户数。



展开阅读全文

页面更新:2024-05-13

标签:用户数   当月   天数   函数   顺序   模板   窗口   日期   情况   用户

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top