首页 > 试题广场 >

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

[编程题]零食类商品中复购率top3高的商品
  • 热度指数:105746 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

商品信息表tb_product_info


(product_id-商品ID, shop_id-店铺ID, tag-商品类别标签, in_price-进货价格, quantity-进货数量, release_time-上架时间)


订单总表tb_order_overall


(order_id-订单号, uid-用户ID, event_time-下单时间, total_amount-订单总金额, total_cnt-订单商品总件数, status-订单状态)


订单明细表tb_order_detail

(order_id-订单号, product_id-商品ID, price-商品单价, cnt-下单数量)


场景逻辑说明
  • 用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款, status-订单状态-订单状态0表示待付款),在订单明细表生成该订单中每个商品的信息;

  • 当用户支付完成时,在订单总表修改对应订单记录的status-订单状态-订单状态1表示已付款;

  • 若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号,订单状态为2表示已退款)。


问题:请统计零食类商品中复购率top3高的商品。

复购率指用户在一段时间内对某商品的重复购买比例,复购率越大,则反映出消费者对品牌的忠诚度就越高,也叫回头率
       此处我们定义:某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数
       近90天指包含最大日期(记为当天)在内的近90天。结果中复购率保留3位小数,并按复购率倒序、商品ID升序排序

输出示例
示例数据的输出结果如下:

解释:
商品8001、8002、8003都是零食类商品,8001只被用户102购买了两次,复购率1.000;
商品8002被101购买了两次,被105购买了1次,复购率0.500;
商品8003被102购买两次,被101和105各购买1次,复购率为0.333。
示例1

输入

DROP TABLE IF EXISTS tb_order_overall;
CREATE TABLE tb_order_overall (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    order_id INT NOT NULL COMMENT '订单号',
    uid INT NOT NULL COMMENT '用户ID',
    event_time datetime COMMENT '下单时间',
    total_amount DECIMAL NOT NULL COMMENT '订单总金额',
    total_cnt INT NOT NULL COMMENT '订单商品总件数',
    `status` TINYINT NOT NULL COMMENT '订单状态'
) CHARACTER SET utf8 COLLATE utf8_bin;

DROP TABLE IF EXISTS tb_product_info;
CREATE TABLE tb_product_info (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    product_id INT NOT NULL COMMENT '商品ID',
    shop_id INT NOT NULL COMMENT '店铺ID',
    tag VARCHAR(12) COMMENT '商品类别标签',
    in_price DECIMAL NOT NULL COMMENT '进货价格',
    quantity INT NOT NULL COMMENT '进货数量',
    release_time datetime COMMENT '上架时间'
) CHARACTER SET utf8 COLLATE utf8_bin;

DROP TABLE IF EXISTS tb_order_detail;
CREATE TABLE tb_order_detail (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    order_id INT NOT NULL COMMENT '订单号',
    product_id INT NOT NULL COMMENT '商品ID',
    price DECIMAL NOT NULL COMMENT '商品单价',
    cnt INT NOT NULL COMMENT '下单数量'
) CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_product_info(product_id, shop_id, tag, in_price, quantity, release_time) VALUES
  (8001, 901, '零食', 60, 1000, '2020-01-01 10:00:00'),
  (8002, 901, '零食', 140, 500, '2020-01-01 10:00:00'),
  (8003, 901, '零食', 160, 500, '2020-01-01 10:00:00');

INSERT INTO tb_order_overall(order_id, uid, event_time, total_amount, total_cnt, `status`) VALUES
  (301001, 101, '2021-09-30 10:00:00', 140, 1, 1),
  (301002, 102, '2021-10-01 11:00:00', 235, 2, 1),
  (301011, 102, '2021-10-31 11:00:00', 250, 2, 1),
  (301003, 101, '2021-11-02 10:00:00', 300, 2, 1),
  (301013, 105, '2021-11-02 10:00:00', 300, 2, 1),
  (301005, 104, '2021-11-03 10:00:00', 170, 1, 1);

INSERT INTO tb_order_detail(order_id, product_id, price, cnt) VALUES
  (301001, 8002, 150, 1),
  (301011, 8003, 200, 1),
  (301011, 8001, 80, 1),
  (301002, 8001, 85, 1),
  (301002, 8003, 180, 1),
  (301003, 8002, 140, 1),
  (301003, 8003, 180, 1),
  (301013, 8002, 140, 2),
  (301005, 8003, 180, 1);

输出

8001|1.000
8002|0.500
8003|0.333
头像 webary
发表于 2021-12-08 20:25:31
零食类商品中复购率top3高的商品 明确题意: 统计零食类商品中复购率top3高的商品。复购率指用户在一段时间内对某商品的重复购买比例,复购率越大,则反映出消费者对品牌的忠诚度就越高,也叫回头率。 此处我们定义:某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数。近90天指包含最大 展开全文
头像 牛客787466413号
发表于 2021-12-21 15:39:00
明确题意 请统计零食类商品中复购率top3高的商品。 某商品复购率 = 近90天内购买它至少两次的人数 ÷ 购买它的总人数 近90天:90天指包含最大日期(记为当天)在内的近90天 复购率保留 3 位小数 复购率 倒序 、商品ID 升序 排序 问题拆解 1. 得到每个商品每个用户购买次数——表t 展开全文
头像 Cole4Youreyez
发表于 2022-04-12 15:26:57
请统计零食类商品中复购率top3高的商品。 1.题目中有三个表,很多人可能立马感觉很麻烦了,而实际上我们要求复购率,需要得只有 uid,event_time,product_id这三项得信息,因此我们考虑先用with t as 将他们提炼出来再进行计算。 with t as (select a.p 展开全文
头像 小灰灰QAQ
发表于 2022-01-04 13:59:09
# 1.查询出所有商品被购买记录 select a.product_id, b.uid , b.order_id from tb_product_info a , tb_order_overall b , tb_order_detail c where a.pr 展开全文
头像 风雪行
发表于 2022-07-28 19:41:18
呃, 先上最直观的思路: 先写一个子查询, 根据product_id分组, 查询对应商品狗买的总人数(无近90天限制) 根据时间过滤, 商品product_id分组, 查询出近90天购买最少两次的人数 然后根据商品product_id连接, 相除即可 下边说一下我的解法 (追求用窗口函数一步到 展开全文
头像 阿翟啊
发表于 2021-12-01 14:08:29
select a.product_id, ifnull(round(cnt_2/cnt_total,3),0.000) repurchase_rate from tb_product_info a left join (select product_id, 展开全文
头像 酸菜鱼土豆大侠
发表于 2022-11-06 23:38:18
【类型】:时间函数经典题 【场景】:留存率、复购率、 【分类】:时间函数 分析思路 难点: 1.时间函数的应用 2.复购率 (1)统计每个货物用户的购买记录;利用窗口函数根据货号、用户分组按购买时间排序 [使用] row_number();timestampdiff() (2)统计零食类商品 展开全文
头像 幻想家刘同学
发表于 2022-01-10 11:27:42
# 指标:复购率 = 近90天内购买它至少两次的人数 / 购买它的总人数 with today as ( select max(date(event_time)) from tb_order_overall ) -- 当天时间 # 1.筛选出近90天的购买记录,根据product_id,uid求出每 展开全文
头像 MakLok
发表于 2022-04-06 18:41:24
题目:请统计零食类商品中复购率top3高的商品,结果中复购率保留3位小数,并按复购率倒序、商品ID升序排序 指标:某商品复购率 = 近90天内,购买它至少两次的人数 ÷ 购买它的总人数;其中,近90天指包含最大日期(记为当天)在内的近90天 注意,这里有个坑点是,“近90天”是指距离tb_orde 展开全文
头像 视星等无穷
发表于 2022-04-15 19:22:00
1.统计每个零食类商品每个用户在近90天内的购买次数 with t1 as( select t1.product_id, t2.uid,count(t2.uid) cnt from tb_product_info t1 join tb_order_detail t3 on t1.product_i 展开全文