You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计同一客户两种场景下的同产品复购次数需求

客户同产品复购次数统计需求

需求说明

需统计同一客户在两种场景下的同产品复购次数:

  • 场景一:特定天数内复购
  • 场景二:特定间隔期内复购(间隔期定义为同一客户购买同一产品时,上一次订单的EndDay与下一次订单的StartDay的差值)

样本数据

create table tbl
(
  Customer  varchar(5),
  StartDay date,
  EndDay date,
  Product  varchar(5),
  Cost  decimal(10,2)
);

insert into tbl values 
('A',       '1/1/2019',      '1/4/2019',      'Shoe',        10.00),
('B',       '2/4/2021',      '2/7/2021',      'Hat',          10.00),
('A',       '1/7/2019',      '1/8/2019',      'Shoe',        10.00),
('B',       '5/8/2018',      '5/9/2018',      'Shoe',         10.00),
('A',       '2/1/2019',      '2/3/2019',      'Shoe',        10.00),
('C',       '6/6/2020',      '6/6/2020',      'Hat',         10.00),
('C',       '11/9/2021',     '12/9/2021',     'Cloth',       10.00),
('A',       '3/3/2019',      '3/17/2019',     'Cloth',        10.00),
('C',       '7/8/2020',      '7/12/2020',      'Hat',         10.00),
('E',       '7/2/2020',      '9/1/2020',      'Hat',        10.00),
('A',       '3/3/2019',      '3/7/2019',      'Shoe',        10.00),
('A',       '7/5/2022',      '7/9/2022',      'Hat',       10.00),
('C',       '6/6/2020',      '6/8/2020',      'Shoe',        10.00),
('B',       '8/2/2018',      '8/9/2018',      'Shoe',         10.00),
('A',       '1/1/2019',      '1/11/2019',     'Cloth',        10.00),
('E',       '9/3/2020',      '10/1/2020',      'Hat',        10.00),
('E',       '7/2/2020',      '7/8/2020',      'Shoe',       10.00);

示例说明

  • 客户A首次购买Shoe的EndDay为'1/4/2019',第二次购买Shoe的StartDay为'1/7/2019',间隔期在30天内;
  • 客户B首次购买Shoe的EndDay为'5/8/2018',第二次购买Shoe的StartDay为'8/2/2018',间隔期在60-90天内。

预期结果

  • 场景一:统计各客户-产品组合在指定天数内的复购次数,结果包含客户、产品、对应天数的复购次数字段
  • 场景二:按间隔期区间(如0-30天、31-60天、61-90天等)统计各客户-产品组合的复购次数分布

实现方案

场景一:特定天数内复购统计(以30天为例)

通过LAG()函数获取同一客户同产品的上一次订单结束日期,计算当前订单开始日期与上一次结束日期的间隔天数,统计符合特定天数的复购次数:

WITH ordered_orders AS (
    SELECT 
        Customer,
        Product,
        StartDay,
        LAG(EndDay) OVER (PARTITION BY Customer, Product ORDER BY StartDay) AS prev_end_day
    FROM tbl
)
SELECT 
    Customer,
    Product,
    COUNT(CASE WHEN DATEDIFF(StartDay, prev_end_day) <= 30 THEN 1 END) AS repurchase_count_30d
FROM ordered_orders
WHERE prev_end_day IS NOT NULL
GROUP BY Customer, Product
ORDER BY Customer, Product;

注:若需统计其他天数,修改<= 30中的数值即可。

场景二:特定间隔期内复购统计

先计算间隔天数,再按预设区间分组统计各区间的复购次数:

WITH ordered_orders AS (
    SELECT 
        Customer,
        Product,
        DATEDIFF(StartDay, LAG(EndDay) OVER (PARTITION BY Customer, Product ORDER BY StartDay)) AS interval_days
    FROM tbl
),
interval_groups AS (
    SELECT 
        Customer,
        Product,
        CASE 
            WHEN interval_days <= 30 THEN '0-30天'
            WHEN interval_days <= 60 THEN '31-60天'
            WHEN interval_days <= 90 THEN '61-90天'
            ELSE '90天以上'
        END AS interval_range
    FROM ordered_orders
    WHERE interval_days IS NOT NULL
)
SELECT 
    Customer,
    Product,
    interval_range,
    COUNT(*) AS repurchase_count
FROM interval_groups
GROUP BY Customer, Product, interval_range
ORDER BY Customer, Product, interval_range;

注:可根据需求调整CASE语句中的区间划分规则。

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19