WITH t1 AS ( SELECT a.product_id, a.cnt, b.uid, DATE(b.event_time) AS dt FROM tb_order_detail a LEFT JOIN tb_order_overall b ON a.order_id = b.order_id LEFT JOIN tb_product_info c ON a.product_id = c.product_id WHERE b.status = 1 AND c.tag = '零食' ), t2 AS ( -- 时间维度表 SELECT max(dt) AS max_dt, DATE_ADD(max(dt),INTERVAL -89 DAY) AS min_dt FROM t1 ), t3 AS ( SELECT * FROM t1 JOIN t2 WHERE dt BETWEEN min_dt AND max_dt ), t4 AS ( SELECT product_id, uid, count(uid) AS uid_count, count(uid) OVER(PARTITION BY product_id) AS pro_count FROM t3 GROUP BY product_id,uid ORDER BY product_id,uid ), t5 AS ( SELECT product_id, SUM(CASE WHEN uid_count >= 2 then 1 ELSE 0 END ) AS flag_sum, MAX(pro_count) AS max_pro_count FROM t4 GROUP BY product_id ) SELECT product_id, ROUND(flag_sum / max_pro_count,3) AS repurchase_rate FROM t5 ORDER BY repurchase_rate DESC,product_id ASC LIMIT 3; # 关键在于top3 记得!