# 求连续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等排序开窗函数,