筛选近90天的信息,并对每个客户购买的次数进行统计,按商品分组:
SELECT c.product_id, b.uid, COUNT(1) num
FROM tb_order_detail c
LEFT JOIN tb_product_info a ON a.product_id = c.product_id
LEFT JOIN tb_order_overall b ON b.order_id = c.order_id
WHERE DATEDIFF(CURDATE(), DATE(event_time)) <= 90
AND a.tag = '零食'
GROUP BY c.product_id, b.uid
求出每个商品的复购率(购买次数>1),并按复购率倒序、商品ID升序排序:
SELECT 
product_id,
round(sum(if(num>1,1,0))/count(1), 3) as repurchase_rate,
ROW_NUMBER() OVER (ORDER BY round(sum(if(num>1,1,0))/count(1), 3) DESC, product_id ASC) rk
FROM
    (
    SELECT c.product_id, b.uid, COUNT(1) num
    FROM tb_order_detail c
    LEFT JOIN tb_product_info a ON a.product_id = c.product_id
    LEFT JOIN tb_order_overall b ON b.order_id = c.order_id
    WHERE DATEDIFF(CURDATE(), DATE(event_time)) <= 90
    AND a.tag = '零食'
    GROUP BY c.product_id, b.uid
    ) m
GROUP BY product_id
最后取排序前3个:
SELECT 
product_id, 
repurchase_rate
FROM
    (
    SELECT 
    product_id,
    round(sum(if(num>1,1,0))/count(1), 3) as repurchase_rate,
    ROW_NUMBER() OVER (ORDER BY round(sum(if(num>1,1,0))/count(1), 3) DESC, product_id ASC) rk
    FROM
        (
        SELECT c.product_id, b.uid, COUNT(1) num
        FROM tb_order_detail c
        LEFT JOIN tb_product_info a ON a.product_id = c.product_id
        LEFT JOIN tb_order_overall b ON b.order_id = c.order_id
        WHERE DATEDIFF(CURDATE(), DATE(event_time)) <= 90
        AND a.tag = '零食'
        GROUP BY c.product_id, b.uid
        ) m
    GROUP BY product_id
    ) n
WHERE rk <= 3