SAS/PROC SQL按prod_id、store_id分组设置flag标识问题求助
原代码问题说明
- 分组维度错误:需求要求按
prod_id和store_id两个字段分组,原代码仅按store_id分组,会把不同prod_id但同store_id的行归为同一组,逻辑错误。 - 赋值规则错误:原代码仅在
n=1且units非零的情况下把flag设为1,后续行即使已经过了首次非零节点,只要units为0就会被设为0,不符合需求。
修正后的SAS实现
方法1:数据步(最简洁,性能最优)
/* 先按分组字段排序,确保by语句正常运行 */ proc sort data=have; by prod_id store_id; run; data want; set have; by prod_id store_id; retain flag; /* 保留上一行的flag值,不会每一行重置 */ /* 每组开头先把flag重置为0 */ if first.store_id then flag=0; /* 只要还没触发过非零记录,且当前行units非零,就把flag永久设为1 */ if flag=0 and units ne 0 then flag=1; run;
方法2:基于你原有逻辑的修正版
proc sort data=have; by prod_id store_id; run; data want; set have; by prod_id store_id; if first.store_id then n=0; if units ne 0 then n+1; /* 只要出现过至少1次非零,n>=1时flag恒为1 */ flag=ifn(n>=1,1,0); drop n; run;
PROC SQL实现(无需提前排序)
proc sql; create table want_sql as select a.*, case when a.row_num >= b.first_non_zero_row then 1 else 0 end as flag from ( /* 给原始数据按顺序加行号,保证排序和原表一致 */ select *, monotonic() as row_num from have ) a left join ( /* 计算每个分组首次出现非零units的行号 */ select prod_id, store_id, min(row_num) as first_non_zero_row from (select *, monotonic() as row_num from have) where units ne 0 group by prod_id, store_id ) b on a.prod_id = b.prod_id and a.store_id = b.store_id order by a.row_num; quit;
内容的提问来源于stack exchange,提问作者Sho
相关产品推荐
相关产品推荐

