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

如何在SAS Enterprise Guide中按VAL2优先级筛选聚合ID对应数据

用SAS实现指定规则的数据筛选与去重

首先先创建可复现的测试数据集:

/* 创建测试数据集 */
data test_data;
  input VAL1 $ ID VAL2 $;
  datalines;
P1   123 P    
P1   123 P    
P1   123 S    
S2   44  C    
S2   44  S    
GG   44  P    
P1   58  S    
P1   58  S    
;
run;

方法一:PROC SQL实现

核心逻辑是给每个ID+VAL1分组,按VAL2的优先级(P/C > S)标记排序,取每组第一条记录:

proc sql;
  create table desired_output as
  select ID, VAL1, VAL2
  from (
    select 
      ID, VAL1, VAL2,
      /* 标记优先级:P/C为高优先级(1),S为低优先级(2) */
      case when VAL2 in ('P','C') then 1 else 2 end as priority,
      /* 按ID、VAL1分组,按优先级升序生成行号 */
      row_number() over (partition by ID, VAL1 order by calculated priority) as rn
    from test_data
  ) t
  where rn = 1;
quit;

逻辑说明:

  • 用case语句给符合需求的P/C记录赋予更高优先级;
  • row_number()窗口函数在ID+VAL1分组内,按优先级排序后生成行号;
  • 筛选rn=1即可得到每个ID+VAL1对应的目标记录,优先保留P/C,无P/C则保留S。

方法二:常规SAS数据步实现

通过排序+by语句去重的方式,先把P/C记录排在每组前面,再保留第一条:

/* 自定义VAL2的排序优先级:P、C在前,S在后 */
proc format;
  value $val2_prio
    'P' = '1'
    'C' = '2'
    'S' = '3';
run;

/* 按ID、VAL1分组,再按自定义优先级排序 */
proc sort data=test_data;
  by ID VAL1 VAL2 $val2_prio.;
run;

/* 保留每个ID+VAL1的第一条记录 */
data desired_output;
  set test_data;
  by ID VAL1;
  if first.VAL1;
run;

逻辑说明:

  • 自定义格式让P/C的排序权重高于S,排序后每组内的P/C记录会排在最前面;
  • 用first.VAL1标记每组的第一条记录,直接保留即可满足需求。

运行上述任意一种方法,都能得到你期望的输出结果:

IDVAL1VAL2
123P1P
44S2C
44GGP
58P1S

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:50:31