# 求连续2天及以上购物的用户和对应天数 # 根据用户分组,按照日期升序排列,再移动日期一个单位新增一个字段,同位置相减,天数为1则是有1+1天是连续的,因为下一条记录出来的结果是null # 直接分组是不可能的,因为只要连续两天及以上,所以一旦有一天和下一天是连续的,那是n=1,就记为n+1=2天;扩展开来,就是有n天直接是连续的,那就是n+1天 # 临时表0,根据用户和日期升序排列,使用窗口函数lead以用户分页,将日期字段往上拉一个单位,使得同记录增加一个下一天日期的字段 WITH temp_0 AS( SELECT user_id, sales_date, LEAD(sales_date) OVER(PARTITION BY user_id ORDER BY sales_date) next_date FROM sales_tb ORDER BY user_id, sales_date ) # 主查询,查用户id,条件语句当某个用户的天数差计算出来不是0,那就说明有连续的天数,对其求和+1 SELECT user_id, CASE WHEN SUM(cnt) != 0 THEN SUM(cnt) + 1 ELSE NULL END days_count FROM( # 子查询,查询用户id,当当天 和 下一天减一天 相等时返回1,其余为0,用于外层求和 SELECT user_id, CASE WHEN DATE_SUB(next_date, INTERVAL 1 DAY) = sales_date THEN 1 ELSE 0 END cnt FROM temp_0 ORDER BY user_id ) a # 用户分组 GROUP BY user_id # 过滤掉没有连续天数的用户 HAVING days_count IS NOT NULL ORDER BY user_id
感觉和之前一道题很像,似乎也可以使用DENSE_RANK等排序开窗函数,