题解 | #零食类商品中复购率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函数。
*/
深信服公司福利 839人发布