You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SAS/Proc SQL技术实现:如何计算各客户过去X个月的累计求和

用SAS实现过去X个月的客户累计求和需求

没问题,我来帮你搞定这个按客户计算过去X个月累计total的需求!下面我会给出SAS数据步Proc SQL两种实现方式,你可以根据场景选择。

前提假设

假设你的业务数据表名为 business_data,包含字段:

  • cust_id:唯一客户标识
  • date_ini:业务发生日期(SAS日期格式,比如YYMMDD10.
  • total:需要累加的数值字段
    X是你要指定的回溯月数(比如过去3个月就设X=3)

方法1:SAS数据步实现

这种方式效率较高,适合大数据量场景,步骤是先按客户和日期排序,再分组累加符合时间范围的数值:

/* 定义回溯月数X,这里设为3,你可以按需修改 */
%let X = 3;

/* 按客户和日期排序,确保累加顺序正确 */
proc sort data=business_data out=sorted_data;
    by cust_id date_ini;
run;

/* 计算累计求和 */
data cumulative_total;
    set sorted_data;
    by cust_id;
    /* 计算过去X个月的起始日期:当前日期往前推X个月的月初 */
    start_date = intnx('month', today(), -&X, 'b');
    /* 按客户分组时重置累计值 */
    if first.cust_id then cumulative_sum = 0;
    /* 只累加date_ini在时间范围内的total */
    if date_ini >= start_date then cumulative_sum + total;
    /* 保留当前客户的累计值直到下一个客户出现 */
    retain cumulative_sum;
run;

说明:

  • intnx('month', today(), -&X, 'b') 会计算当前日期往前推X个月的月初日期,比如今天是2024-05-20,X=3的话,start_date就是2024-02-01
  • 如果需要包含当前日期往前推X个月的同一天(而不是月初),可以把'b'改成's',比如intnx('month', today(), -&X, 's')

方法2:Proc SQL实现

这种方式更适合灵活的关联查询,通过自连接筛选每个客户在时间范围内的所有记录并求和:

%let X = 3;

proc sql;
    create table cumulative_total_sql as
    select 
        a.cust_id,
        a.date_ini,
        a.total,
        sum(b.total) as cumulative_sum format=comma12.2
    from business_data a
    left join business_data b
        on a.cust_id = b.cust_id
        and b.date_ini between intnx('month', today(), -&X, 'b') and today()
    group by a.cust_id, a.date_ini, a.total
    order by a.cust_id, a.date_ini;
quit;

说明:

  • 这里的自连接会为每个客户的每条记录,关联该客户过去X个月内的所有total值并求和
  • 如果需要只计算到当前记录的date_ini之前的累计(而不是到今天),可以把today()改成a.date_ini,即:
    and b.date_ini between intnx('month', a.date_ini, -&X, 'b') and a.date_ini
    

小提示

  • 确保date_ini是SAS日期格式,如果是字符型,记得先用input(date_ini, YYMMDD10.)转换成日期型
  • 如果X是动态传入的参数,可以用宏变量更灵活地控制

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

火山引擎 最新活动