【SQL】大数据高频面试题之连续活跃天数

  数据岗经常分析的一个指标是连续登录天数,今天来学习求解连续登录天数问题的一般流程。

  对于连续天数问题的求解,一般会用到窗口函数 row_number(),求解的思路如下:

假定用户的登录日期是:

uidlog_dt
12022-02-03
12022-02-06
12022-02-07
12022-02-08
12022-02-11
12022-02-12

使用 row_number() 对 log_dt 进行编号:

uidlog_dtrn
12022-02-031
12022-02-062
12022-02-073
12022-02-084
12022-02-115
12022-02-126

使用 log_dt 减去 rn 得到 group_dt:

uidgroup_dt
12022-02-02
12022-02-04
12022-02-04
12022-02-04
12022-02-06
12022-02-06

次数我们发现,对于连续登录的日期,减去 row_number 之后得到的日期是同一天!此时答案也呼之欲出了,对 group_dt 进行 group by 操作,再使用 cnt,这个 cnt 值就是连续登录的天数:

uidgroup_dtcnt
12022-02-021
12022-02-043
12022-02-062

所以最大连续登录天数就是 3 天。下面通过一道例题来实战训练。

牛客SQL29.某宝店铺连续2天及以上购物的用户及其对应的天数[1]

描述

11月结束后,小牛同学需要对其在某宝的网店就11月份用户交易情况和产品情况进行分析以更好的经营小店。

11月份销售数据表sales_tb如下(其中,sales_date表示销售日期,user_id指用户编号,item_id指货号,sales_num表示销售数量,sales_price表示结算金额):

sales_dateuser_iditem_idsales_numsales_price
2021-11-011A001190
2021-11-012A0022220
2021-11-012B0011120
2021-11-023C0012500
2021-11-024B0011120
2021-11-035C0011240
2021-11-036C0021270
2021-11-047A0031180
2021-11-048B0021140
2021-11-049B0011125
2021-11-0510B0031120
2021-11-0510B0041150
2021-11-0510A0031180
2021-11-0611B0031120
2021-11-0610B0041150

请你统计连续2天及以上在该店铺购物的用户及其对应的次数(若有多个用户,按user_id升序排序),以上例子的输出结果如下:

user_iddays_count
102

用上面讲解的方法进行求解。为了清晰展现求解过程,这里使用了 with 表达式:

with t1 as(
    select user_id,sales_date,
        row_number() over(partition by user_id order by sales_date) as rn
    from sales_tb
),
t2 as(
    select user_id,sales_date,
        date_sub(sales_date,interval rn day) as group_dt
    from t1
)
select user_id,count(1) as days_cnt
from t2
group by user_id,group_dt
having days_cnt>=2;

t1 表如下:

user_idsales_datern
12021-11-011
22021-11-011
22021-11-012
32021-11-021
42021-11-021
52021-11-031
62021-11-031
72021-11-041
82021-11-041
92021-11-041
102021-11-051
102021-11-052
102021-11-053
102021-11-064
112021-11-061

t2 表如下:

user_idsales_dategroup_dt
12021-11-012021-10-31
22021-11-012021-10-31
22021-11-012021-10-30
32021-11-022021-11-01
42021-11-022021-11-01
52021-11-032021-11-02
62021-11-032021-11-02
72021-11-042021-11-03
82021-11-042021-11-03
92021-11-042021-11-03
102021-11-052021-11-04
102021-11-052021-11-03
102021-11-052021-11-02
102021-11-062021-11-02
112021-11-062021-11-05

欢迎关注公众号。
在这里插入图片描述

Reference

[1]牛客SQL29.某宝店铺连续2天及以上购物的用户及其对应的天数:https://www.nowcoder.com/practice/63ac3be0e4b44cce8dd2619d2236c3bf?tpId=268&tqId=2285906&ru=/exam/oj&qru=/ta/sql-factory-interview/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值