题解 | #某宝店铺连续2天及以上购物的用户及其对应的天数#
某宝店铺连续2天及以上购物的用户及其对应的天数
http://www.nowcoder.com/practice/63ac3be0e4b44cce8dd2619d2236c3bf
解题思路: 反向推导, 正向执行
反向推导
- 获得连续2天及以上购物的用户及其对应的天数, 需要计算每位用户连续购买的天数, 再筛选出不小于2天的用户及其对应的天数
- 计算用户连续购买的天数, 需要定位出用户连续购买的日期, 在进行统计
正向执行
- 首先准备一个11月份每位用户以天为单位的购买记录, 并定位出连续购买的参照日期
- 计算每位用户连续购买的天数
- 筛选出连续2天及以上购物的用户及其对应的天数
一个关键点
- 连续购买天数的计算, 考虑连续购买的前后日期差应当相等并且为1, 所以可以通过先对日期排序, 再用当日的日期减去排序号, 如果日期连续, 则得到的日期差相同(即开始连续购买的前一天日期), 以此为依据计算连续的天数
select distinct
user_id,
days
from (
select user_id,
count(*) over (partition by user_id, tp_dt) as days
from (
select distinct
sales_date,
user_id,
date_sub(sales_date, interval dense_rank() over (partition by user_id order by sales_date) day) as tp_dt
from sales_tb
where date_format(sales_date, "%Y%m") = "202111"
) as a
) as b
where days >= 2
order by user_id