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为零食的。

这个题今天第一次做有点晕,还需要多复习几遍