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 记得!