SELECT t1.product_id,ifnull(round(cnt_2/cnt_total,3),0.000) repurchase_rate
FROM tb_product_info a
LEFT JOIN (SELECT product_id,
COUNT(DISTINCT uid) cnt_total
FROM tb_order_detail a
LEFT JOIN tb_order_overall c ON a.order_id=c.order_id
GROUP BY product_id
) t1 ON a.product_id=t1.product_id
LEFT JOIN
(SELECT t.product_id,COUNT(t.uid) cnt_2
FROM
(SELECT a.product_id,uid,COUNT(*) cnt
FROM tb_order_detail a
LEFT JOIN tb_product_info b ON a.product_id=b.product_id
LEFT JOIN tb_order_overall c ON a.order_id=c.order_id
AND DATEDIFF((SELECT max(date(event_time)) FROM tb_order_overall),date(event_time))<90
GROUP BY a.product_id,uid
) t
WHERE cnt>=2
GROUP BY product_id
)t2 ON a.product_id=t2.product_id
WHERE tag='零食'
ORDER BY repurchase_rate DESC,product_id
LIMIT 3;
按照大佬思路写的,可能状态不好写得我欲哭无泪。理一下思路:
问题:请统计零食类商品中复购率top3高的商品。
此处我们定义:某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数
近90天指包含最大日期(记为当天)在内的近90天。结果中复购率保留3位小数,并按复购率倒序、商品ID升序排序
三个表连接,表a--商品信息表(内有tag可筛选出零食类),表t1--商品id和购买该商品的总人数,表t2--商品id和90天内购买该商品两次以上的人数(内包含一个子查询,表t--商品id、用户id和90天内每个人购买每个商品的次数)(t2购买该商品两次以上的人数需要按商品id聚合计算人数,筛选条件为每个人购买每个商品的次数>=2),表连接以后筛选出tag为零食的。
这个题今天第一次做有点晕,还需要多复习几遍