SQL-开窗函数计算复购指标统计案例

本文探讨了在SQL中计算复购指标的重要性,包括复购金额、不同周期的复购统计,并强调了动态复购的挑战。通过使用lead()和sum() over(partition by order by range)等开窗函数,可以实现复购详情的精确计算。文中以用户消费记录为例,展示了如何统计3天、7天和30天内的会员复购金额,详细说明了计算过程和所需的数据序列化步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无论是分析还是数仓,我们经常会碰到计算复购场景,复购计算过程中涉及到以下几点:

1、除用户是否归属复购外,复购指标统计,如金额、营收等

2、不同复购周期的计算,7天,30天,60天,90天等等

3、动态复购,用户每天起始往后的复购详情,又同归因

这里复购的统计变化比较多,主要涉及到两类的计算去重用户统计,复购指标统计。

如果在计算过程中不涉及到复购指标的统计,可以直接使用lead()开窗函数,在之前说的开窗函数里面讲过,具体的方法可以查下。

针对计算复购指标同样开窗,利用sum()over(partition by order by range )的函数,之前也介绍过,但是计算过程中需要构建一个日期序列。

举个基础的复购指标案例:

数据:用户消费记录:用户标识mid、消费日期cid、消费金额pnum

需求:统计用户3天、7天、30天会员复购金额

思路:将时间进行序列化后使用sum开窗的range进行求和处理

开窗函数具体的使用语法可以之前面的内容查找

数据表:

mid       cid     pnum
10086	2022-01-07	2.0
10086	2022-02-05	2.0
10086	2022-01-15	2.0
10086	2022-01-05	2.0
10086	2022-01-18	2.0
10086	2022-01-11	2.0
10086	2022-02-01	2.0
10086	2022-03-01	2.0
10086	2022-01-01	2.0
10086	2022-01-02	2.0
10086	2022-01-03	2.0

sql语句:

with test_table as(
    -- 创建一个用户消费记录临时表
select '10086' as mid,'2022-01-01' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-02' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-03' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-05' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-07' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-11' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-15' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-01-18' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-02-01' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-02-05' as cid,2.0 as pnum
union all 
select '10086' as mid,'2022-03-01' as cid,2.0 as pnum
)
select mid,cid,cid_row,pnum
-- 开窗求和 根据会员开窗,按照时间序列求和当前时间往后+2的序列内的值
,sum(pnum)over(partition by mid order by cid_row RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING) as fg_pnum_3
,sum(pnum)over(partition by mid order by cid_row RANGE BETWEEN CURRENT ROW AND 6 FOLLOWING) as fg_pnum_7
,sum(pnum)over(partition by mid order by cid_row RANGE BETWEEN CURRENT ROW AND 29 FOLLOWING) as fg_pnum_30
FROM 
(select mid
    ,cid
    ,datediff(cid,'2022-01-01') as cid_row  -- 日期减去固定年月日创建一个序列
    ,pnum 
    FROM test_table
) as aa 

数据结果:

mid   cid   cid_row   pnum   fg_pnum_3 fg_pnum_7 fg_pnum_30
10086	2022-01-01	0	2.0	6.0	10.0	16.0
10086	2022-01-02	1	2.0	4.0	8.0	14.0
10086	2022-01-03	2	2.0	4.0	6.0	14.0
10086	2022-01-05	4	2.0	4.0	6.0	12.0
10086	2022-01-07	6	2.0	2.0	4.0	12.0
10086	2022-01-11	10	2.0	2.0	4.0	10.0
10086	2022-01-15	14	2.0	2.0	4.0	8.0
10086	2022-01-18	17	2.0	2.0	2.0	6.0
10086	2022-02-01	31	2.0	2.0	4.0	6.0
10086	2022-02-05	35	2.0	2.0	2.0	4.0
10086	2022-03-01	59	2.0	2.0	2.0	2.0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值