主要信息

  • sales_tb(sales_date表示销售日期,user_id指用户编号)
  • 求用户连续下单次数

问题拆解

总体思路

  • 如何判断是否连续:是否连续例如1月10号、1月11号、1月12号、1月14号,行数分别为1、2、3、4,日期数-行数分别为1月9号、1月9号、1月9号、1月10号,可知道日期数-行数相同则为连续的天数
  • 基于是否连续判断是否连续大于一定天数

具体实现

  • 根据user_id分组并根据日期排序sales_date,对用户购买记录标记行号rn
  • 使用每一行的日期时间减去该行的行号res,统计根据res值分组存在(group by having)连续连天以上的user_id

考点:ROW_NUMBER使用、DATE_ADD使用 GROUP BY WHERE HAVING语句使用,对连续天数判断也是个常见的考察技巧

SELECT 
	user_id, 
    COUNT(*) AS days_count
FROM (
		SELECT 
  			*, 
  			ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY sales_date ASC) AS rn
        FROM 
  			sales_tb
        WHERE 
  			sales_num > 0
	) t
GROUP BY user_id, DATE_ADD(sales_date, INTERVAL -rn DAY)
HAVING days_count >= 2
ORDER BY user_id;