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

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

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

题目有2点容易引起理解差异:

1、最大日期(当天),是分组取每个商品的最大日期,还是全表的最大日期;

2、某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数,分母可以是限制为90天内的总人数,也可以不限制;

理解不同,写出的SQL也不同,不过看其它题解,好像都可以通过测试用例;

建议各位不用纠结,清楚针对不同场景如何编写对应的SQL即可;

以下为取全表的最大日期、总人数不限制天数的写法(跟其它题解异曲同工,部分步骤可合并简化,建议分步执行):

WITH t as(
    SELECT tod.product_id, too.uid, date(too.event_time) AS order_time,
           max(date(too.event_time)) over() AS today
    FROM tb_order_detail tod, tb_order_overall too, tb_product_info tpi 
    WHERE tod.order_id = too.order_id 
      AND tod.product_id = tpi.product_id 
      AND too.status = 1
      AND tpi.tag = '零食'
)
SELECT product_id, round(sum(rebuy_user) / count(DISTINCT uid), 3) AS repurchase_rate
FROM (
    SELECT product_id, uid, order_time, today,
           if(sum(IF(datediff(today, order_time) <= 90, 1, 0)) over(PARTITION BY product_id,uid  ORDER BY order_time) > 1, 1, 0) AS rebuy_user
    FROM t
    ORDER BY product_id) t2
GROUP BY product_id
ORDER BY repurchase_rate DESC, product_id
LIMIT 3;

/*
if(sum(IF(datediff(today, order_time) <= 90, 1, 0)) over(PARTITION BY product_id,uid  ORDER BY order_time) > 1, 1, 0) AS rebuy_user
这一句可能不太好理解,主要含义为标记订单明细中,为90天内购买次数大于1的用户,并且最外层嵌套IF,不重复标记(因为复购用户在明细表中会出现多次),便于外层SQL直接使用SUM函数。
*/

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务