# 先将订单总表中退款的订单剔除,后连接订单明细表,于是形成各商品销售情况表
with k1 as(
select t1.order_id, t1.uid, event_time, status, product_id, price, cnt
from (
    select *
    from tb_order_overall
    where status != 2
) t1
join tb_order_detail t2
on t1.order_id = t2.order_id)

# 计算零食类商品复购率
select t3.product_id, round(ifnull(fugou_num, 0)/all_num, 3) repurchase_rate 
from (
    select *
    from tb_product_info
    where tag = '零食'
) t3
left join (
    # 从商品销售情况表中计算各商品近90天内的至少购买它两次的人数
    select product_id, count(uid) fugou_num
    from (
        select product_id, uid, count(*)
        from (
            select *, max(date(event_time))over() today
            from k1
        ) k2
        where datediff(today, date(event_time)) < 90
        group by product_id, uid
        having count(*) >= 2
    ) k3
    group by product_id 
) t4
on t3.product_id = t4.product_id
join (
    # 从商品销售情况表中计算各商品的购买总人数
    select product_id, count(distinct uid) all_num
    from k1
    group by product_id 
) t5
on t3.product_id =t5.product_id
order by repurchase_rate desc
limit 3;




好家伙,以后题目一定要看清楚,自测时运行通过了,结果一直提交不过。找了很久的问题,结果发现:

没加上tag = "零食"的条件,啊啊啊啊,以后一定要看清楚需求。