ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL经典面试题-连续3天登陆用户 (:机会终于来了系列

2020-12-03 21:57:53  阅读:1159  来源: 互联网

标签:面试题 rn SQL t1 user 经典 date login id


写在前面

连续登陆问题可以扩展到很多其他方面:
1.我们每天使用的某团外卖,就可以统计用户连续点外卖的天数。如果发现你连续5天都没有点外卖,可能就会给你发优惠券,刺激消费

2.比如银行贷款你连续预期好多好多天,一直没有处理。银行就会按照自己的流程对你采集一定的措施。

反正就是确实在数仓中还是用的比较多的,比较实际的需求。

需求:编写hql,统计连续3天登陆的用户
在这里插入图片描述

分析:如何判断连续,这个是本题的关键
可以对user_id进行分组排序后,得到rn,然后用登陆日期减去rn ,就会得到一个日期差,如果是连续的话,这个日期差值应该也是连续一致的。

SQL实现

select
       user_id,
       --date_sub(login_date, t1.rn) as date_flag,
       count(1) as cnt
from
(
select user_id,
       login_date,
       row_number() over(partition by user_id order by login_date asc) rn
from user_login) t1
group by user_id, date_sub(login_date, t1.rn)
having cnt >=3;

执行,得到正确结果
在这里插入图片描述

这里还提供另外一种写法:

select distinct  user_id
from
(
select user_id,
       login_date,
       lead(login_date, 2, -1) over(partition by user_id order by login_date desc) as date_flag
from user_login
group by user_id,login_date) t1
where date_sub(cast(t1.login_date as date), 2) = cast(t1.date_flag as date);

标签:面试题,rn,SQL,t1,user,经典,date,login,id
来源: https://blog.csdn.net/liuge36/article/details/110572097

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有