SAS如何按POLICY_Vintage分组计算同组相邻Run_date的保单数量差值
SAS分组计算相邻日期保单数差值修正代码
逻辑调整说明
要实现同POLICY_Vintage分组内相邻Run_date的number_policy差值计算,核心要规避跨分组取值问题,修正逻辑如下:
- 拼接历史数据后必须保证按
policy_vintage、run_date升序排序 - 每个分组的第一条观测没有上一期数据,差值直接设为缺失
- 非第一条观测直接用当期值减上一期滞后值即可,不需要限制仅最后一条输出差值
完整可运行代码
/* 计算当期各vintage的保单数 */ proc sql; create table policy_vintage_weekly as select policy_vintage ,count(NRB) as number_policy ,today() as Run_Date format weeku. from PolisyEnd where POLIS= "W" group by policy_vintage ; quit; /* 拼接历史数据+当期数据,按分组和日期排序 */ data policy_vintage_weekly_all; set _work.policy_vintage_weekly (where=(run_date ne today())) policy_vintage_weekly ; by policy_vintage run_date; run; %if &syscc. = 0 %then %do; /* 分组计算差值 */ data _work.policy_vintage_weekly; set policy_vintage_weekly_all; by policy_vintage run_date; /* 分组第一行无上期,差值为空;其余行用当期减上期值 */ if first.policy_vintage then diff_value = .; else diff_value = number_policy - lag(number_policy); run; %end; /* 输出报告 */ proc print data=_work.policy_vintage_weekly noobs; var policy_vintage number_policy run_date diff_value; run;
关键逻辑说明
lag(number_policy)会返回上一条观测的number_policy值,配合first.policy_vintage判定,保证不会读取上一个分组的数值- 排序步骤必须包含
run_date,避免出现日期倒序导致差值计算错误
内容的提问来源于stack exchange,提问作者Przemek Dabek
相关产品推荐
相关产品推荐

