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