如何在SAS Enterprise Guide中按分组筛选符合特定条件的行
SAS: Filter DELETED Records Where No REMAINING Exists in Same GROUP & COUNTRY
你的需求是筛选出所有STATUS为DELETED的记录,但要排除那些在同一GROUP和COUNTRY组合下存在STATUS为REMAINING的记录。之前的尝试要么忽略了GROUP维度(第一个PROC SQL),要么DATA步语法有误,下面给你两种正确的实现方式:
方法1:PROC SQL(关联GROUP+COUNTRY维度)
我们需要先找出所有存在REMAINING记录的GROUP+COUNTRY组合,然后在主查询中排除这些组合里的DELETED记录:
PROC SQL; CREATE TABLE WORK.OUTPUT AS SELECT * FROM WORK.INPUT WHERE STATUS = 'DELETED' AND (GROUP, COUNTRY) NOT IN ( SELECT GROUP, COUNTRY FROM WORK.INPUT WHERE STATUS = 'REMAINING' ); QUIT;
解释:
- 子查询
SELECT GROUP, COUNTRY FROM WORK.INPUT WHERE STATUS = 'REMAINING'会返回所有有REMAINING记录的分组+国家组合(比如(1, DE)、(3, ES))。 - 主查询筛选
DELETED记录,同时排除掉属于这些组合的记录,这样就只保留了那些分组+国家里完全没有REMAINING的DELETED记录,正好符合你的需求。
方法2:DATA步(BY组处理)
先按GROUP和COUNTRY排序,然后通过BY组标记每个组合是否存在REMAINING状态,最后筛选符合条件的记录:
/* 先排序,确保BY组处理正常 */ PROC SORT DATA=WORK.INPUT OUT=WORK.SORTED; BY GROUP COUNTRY; RUN; DATA WORK.MARKED; SET WORK.SORTED; BY GROUP COUNTRY; RETAIN has_remaining 0; /* 每个GROUP+COUNTRY组开始时重置标记 */ IF FIRST.COUNTRY THEN has_remaining = 0; /* 如果组内有REMAINING记录,标记该组 */ IF STATUS = 'REMAINING' THEN has_remaining = 1; RUN; /* 筛选符合条件的记录 */ DATA WORK.OUTPUT; SET WORK.MARKED; WHERE STATUS = 'DELETED' AND has_remaining = 0; RUN;
解释:
- 第一步排序是BY组处理的前提,确保同一
GROUP+COUNTRY的记录连续排列。 RETAIN语句让has_remaining的值在组内持续保留,只要组里出现一条REMAINING记录,整个组的标记就会被设为1。- 最后筛选
DELETED且has_remaining=0的记录,就能得到完全符合需求的结果。
内容的提问来源于stack exchange,提问作者sonarclick
相关产品推荐
相关产品推荐

