题解 | #零食类商品中复购率top3高的商品#

零食类商品中复购率top3高的商品

http://www.nowcoder.com/practice/9c175775e7ad4d9da41602d588c5caf3

SELECT a.product_id, ROUND(IFNULL(repurchase_num/people_cnt,0),3) repurchase_rate
FROM tb_product_info a 
LEFT JOIN # 要保留复购率为0的,那就用左链接去匹配出那些count为0的product,然后把null转化为0 
    (SELECT t1.product_id, t1.people_cnt, t2.repurchase_num FROM
        (
        SELECT c.product_id, COUNT(DISTINCT b.uid) people_cnt  #某一个商品,有多少人买过(没有时间限制下)
        FROM tb_order_detail c JOIN tb_order_overall b
        ON c.order_id = b.order_id
        GROUP BY c.product_id
        ) t1  
    JOIN 
        (
        SELECT # c.product_id, b.uid, COUNT(DISTINCT c.id)
        c.product_id, COUNT(b.uid) OVER(PARTITION BY c.product_id) repurchase_num # 某一个产品,复购的人数
        FROM tb_order_detail c JOIN tb_order_overall b
        ON c.order_id = b.order_id
        WHERE DATE_FORMAT(b.event_time,"%Y-%m-%d") > (SELECT DATE_SUB( DATE_FORMAT(MAX(event_time),"%Y-%m-%d"),INTERVAL 90 DAY ) 
                                                    FROM tb_order_overall)  
                                                    # where中不能用聚合函数;需要括号重命名表嘛
        GROUP BY c.product_id, b.uid # 某一个商品,被某一个人购买的次数
        HAVING COUNT(DISTINCT c.id)>= 2
        ) t2 ON t1.product_id = t2.product_id
    ) t ON a.product_id = t.product_id
WHERE a.tag = "零食" 
ORDER BY repurchase_rate DESC
LIMIT 3
步骤:
1. t1 join t2变成t表
2. a left join t
调试过程:可以自己逐级跑一次,直观看看会得到什么结果
1. 先跑下t1这个表
2.再跑下t2这个表
3.跑下t1 join t2 后的t表
4.整个跑一遍
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务