SQL-经典的连续登录问题
SQL连续登录 问题可以说是SQL笔试题的常客了,一是因为工作中有不少应用场景,二是因为能初步考察数分人员的SQL功底。连续登录主要有2个方面的应用,其一是圈选客户,比如选取连续登录7天的客户,其二是客户标签,比如计算客户过去90天的最长连续登录天数作为衍生变量。本文就总结一下SQL连续登录问题的实现。
首先明确连续登录问题的底层处理逻辑,连续登录问题的核心是连续,连续的内层含义是日期递增1,我们主要就是从递增1这个点入手。
下面看看具体实例的代码实现:
假设我们有如下源表login_detail:
- 选取连续登录7天的客户:
--方法1:使用row_number()创建辅助列 with --1:按客户号+登录日期去重排序 tmp1 as ( select cust_id, date(login_time) as login_date from login_detail group by 1,2 order by 1,2 ), --2:按客户号分组添加行号 tmp2 as ( select cust_id, login_date, row_number() over (partition by cust_id order by login_date) as row_num from tmp1 ), --3:创建辅助列-登录日期减行号 tmp3 as ( select cust_id, login_date, date_add('day', -row_num, login_date) as login_date_2 from tmp2 ) --4:按客户号+辅助列分组计数并筛选出计数为7的客户 select cust_id from tmp3 group by cust_id, login_date_2 having count(1) = 7; --按需调整条件 --方法2:使用lag()创建辅助列 with --1:按客户号+登录日期去重排序 tmp1 as ( select cust_id, date(login_time) as login_date from login_detail group by 1,2 order by 1,2 ), --2:使用lag()创建辅助列 tmp2 as ( select cust_id, login_date, lag(login_date, 6) over (partition by cust_id order by login_date) as login_date_2, --按需调整 date_add('day', -6, login_date) as login_date_3 --按需调整 from tmp1 ) --3:筛选出客户 select cust_id from tmp2 where login_date_2 = login_date_3;
最终筛选出的结果为客户A,能够看出方法2比方法1精简点,但方法1应用更灵活。
- 计算每个客户的最长连续登录天数:
with --1:按客户号+登录日期去重排序 tmp1 as ( select cust_id, date(login_time) as login_date from login_detail group by 1,2 order by 1,2 ), --2:按客户号分组添加行号 tmp2 as ( select cust_id, login_date, row_number() over (partition by cust_id order by login_date) as row_num from tmp1 ), --3:创建辅助列-登录日期减行号 tmp3 as ( select cust_id, login_date, date_add('day', -row_num, login_date) as login_date_2 from tmp2 ), --4:按客户号+辅助列分组计数 tmp4 as ( select cust_id, login_date_2, count(1) as consecutive_login_days from tmp3 group by 1,2 ) --5:按客户号分组取最大连续登录天数 select cust_id, max(consecutive_login_days) as max_consecutive_login_days from tmp4 group by 1;
结果如下:
代码使用Presto SQL实现,其他SQL可能在日期加减函数上会有差异。值得强调的是,连续登录问题的核心是如何判断连续,登录只是个特定行为,我们完全可以将登录行为换成其他用户行为,问题涉及的字段实际就2个:客户ID+日期,只要掌握了文中所示的处理方法,就可以做到举一反三了。
原创文章,欢迎转载,转载请注明出处并留下原文链接。