题解 | #某宝店铺连续2天及以上购物的用户及其对应的天数#

某宝店铺连续2天及以上购物的用户及其对应的天数

http://www.nowcoder.com/practice/63ac3be0e4b44cce8dd2619d2236c3bf

主要信息

  • 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;
全部评论
存在一个用户一天可能会买多次这种情况,row_number可以换成dense_rank?
1 回复 分享
发布于 2022-05-21 11:01
以uid =10 的用户举例,登录日期是10-15,10-15,10-15,10-16. Row_number 排序后 1,2,3,4 相减之后就是 4,3,2,2.count 之后结果是2 所以 不影响。如果换成dense_rank, 需要distinct 去重,不然会出错。 假设是dense_rank 就是 1,1,1,2。 相减之后就是 4,4,4,4. 去重后实际为 4,4。 count 之后结果还是2
1 回复 分享
发布于 2022-05-29 14:08

相关推荐

高斯林的信徒:问你有没有保底,好人啊,就差把这是kpi面告诉你了
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务