题解 | #零食类商品中复购率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.整个跑一遍
全部评论

相关推荐

04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务