题解 | #零食类商品中复购率top3高的商品#

零食类商品中复购率top3高的商品

https://www.nowcoder.com/practice/9c175775e7ad4d9da41602d588c5caf3

# 求商品,限制是零食类商品复购率前三的
# 复购率:近90天购买它大于等于2次的人数;购买它的总人数

# 先联结三个表,查询商品id,uid;限制付款的订单,还有近90天,还有商品类型为零食
# 今天的定义是最大日期,在临时表0的where语句里面没有办法使用聚合函数,所以在下一个表里面筛选日期
# 查询必要的 商品id,uid,记录的日期, 聚合开窗函数求记录的最大日期作为一个新字段
WITH temp_0 AS(
    SELECT product_id, uid, DATE(event_time) event_date, MAX(DATE(event_time)) OVER() today
    FROM tb_order_detail
    JOIN tb_product_info a USING(product_id)
    JOIN tb_order_overall b USING(order_id)
    WHERE status = 1 AND tag = '零食'
    ),
	# 临时表1,查询必要的product_id, uid和这两个组合起来的记录数——就是每个用户购买了几次这个商品
	# 根据日期筛选,因为是连今天算的近90天,所以跨89天
    temp_1 AS(
    SELECT product_id, uid, COUNT(*) u_p_c
    FROM temp_0
    WHERE event_date BETWEEN DATE_SUB(today, INTERVAL 89 DAY) AND today
    GROUP BY product_id, uid
    ),
	# 临时表2,查询上面所有,查询每个用户对每个商品的复购次数,如果购买次数大于等于2,那么复购次数为1,
	# 还有每个商品被多少人购买过,因为在上个表就已经对product_id, uid分组,所以可以这样执行
	# 这样就得到了每个商品的复购人次,和总共购买人次
    temp_2 AS(
    SELECT *, 
        SUM(IF(u_p_c >= 2, 1, 0)) OVER(PARTITION BY product_id,uid) p_c_again,
        COUNT(*) OVER(PARTITION BY product_id) p_c_all
    FROM temp_1
    )

# 主查询根据公式计算复购率
# p_c_again在一些人那里是0,是因为没有复购,所以只求和计算复购的人次
# 最后不要忘了是求前三
SELECT product_id, ROUND(SUM(p_c_again)/p_c_all, 3) repurchase_rate
FROM temp_2
GROUP BY product_id
ORDER BY repurchase_rate DESC, product_id
# LIMIT 0, 3
LIMIT 3 OFFSET 0

踩的坑:没有限制前三条

思路:

1.联结三张表,找到符合各种要求的记录‘

2.要计算复购率,先要找打多少人次复购,多少人次购买

3.复购的定义是购买两次及以上,所以要先查询每个用户对每个商品的购买次数,再根据复购条件计算出复购人次

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务