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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:36