窗口函数解决连续类问题-淘宝店铺连续2天及以上购物的用户及其对应的天数

1. 题目描述

某宝店铺连续2天及以上购物的用户及其对应的天数_牛客题霸_牛客网

 

 

2. 解题思路

  • ‘连续’问题,如果不用自连接,可以选择使用窗口函数的排名功能:按照用户分区,按照日期排名,这样就可以给同一个人不同日期的记录编号了。比如本题中,我们可以得到'10, 2021-11-05, rank=1', '10, 2021-11-06, rank=2'。
  • 接下来如果这个人的购买日期是连续的,那么上面得到的那个结果中【日期减排名】,会得到一样的日期值。比如上面那个例子,都会得到2021-11-04这个值;如果不连续,比如'10, 2021-11-05, rank=1', '10, 2021-11-12, rank=2', 这样日期减排名不会得到一样的值。
  • 这时我们再根据用户,以及日期减排名的结果,这两项进行group by,聚合函数用count,就可以数出每个用户,连续购物记录的天数。根据题目要求筛选一下就得到答案了。

根据上述思路,有两点需要注意的:

  • 由于我们不在乎同一个用户在同一天的多条购买记录,我们在乎的是一共连续了多少天。所以第一步的select里要加distinct,否则比如10号用户,就会被保留三个'2021-11-05'。
  • 使用窗口函数进行排名编号时,对于10号用户,我们想得到给所有的2021-11-05并列排名为1,2021-11-06排名为2,而不是4,所以要用dense_rank而不是rank或row_number。

3. 最终代码

SELECT user_id, COUNT(*) AS days_count
FROM
(SELECT DISTINCT user_id, sales_date, 
    DENSE_RANK() over (PARTITION BY user_id ORDER BY sales_date) AS rk
FROM sales_tb)a
GROUP BY user_id, DATE_ADD(sales_date, INTERVAL -rk day)
HAVING days_count >= 2
ORDER BY user_id


版权声明:本文为Nancyninghao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。