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

如何在SAS Enterprise Guide或PROC SQL中按优先级聚合字符数据

SAS实现按ID优先级标记分组需求

问题说明

现有SAS表结构如下:

  • ID:数值型
  • GROUP:字符型,仅包含PRI或CON两个取值

原始数据:

IDGROUP
8945CON
9567PRI
9567PRI
284CON
284CON
284PRI

需要生成新字符列COL1,规则为:

  • 若某ID存在PRI组记录,无论CON出现多少次,COL1均为PRI
  • 若ID仅包含CON记录,则COL1为CON(PRI优先级高于CON)

期望结果表:

IDCOL1
8945CON
9567PRI
284PRI

实现方法

方法一:PROC SQL实现

方式1:利用字符排序特性聚合

由于字符排序中PRI的ASCII值大于CON,使用MAX()函数直接取每个ID的最高优先级取值:

PROC SQL;
    CREATE TABLE result AS
    SELECT ID,
           MAX(GROUP) AS COL1
    FROM original_table /* 替换为你的实际表名 */
    GROUP BY ID;
QUIT;

方式2:用CASE WHEN逻辑判断

通过子查询判断ID是否存在PRI记录,逻辑更直观:

PROC SQL;
    CREATE TABLE result AS
    SELECT ID,
           CASE WHEN EXISTS(SELECT 1 FROM original_table t2 WHERE t2.ID = t1.ID AND t2.GROUP = 'PRI')
                THEN 'PRI'
                ELSE 'CON'
           END AS COL1
    FROM original_table t1
    GROUP BY ID;
QUIT;

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

方式1:排序后取首条记录

先按ID排序,同一ID下让PRI排在最前面,再保留每个ID的第一条记录:

/* 排序:同一ID内PRI优先排在前面 */
PROC SORT DATA=original_table OUT=sorted_data;
    BY ID DESCENDING GROUP;
RUN;

/* 提取每个ID的第一条记录作为结果 */
DATA result;
    SET sorted_data;
    BY ID;
    IF FIRST.ID THEN DO;
        COL1 = GROUP;
        OUTPUT;
    END;
    KEEP ID COL1;
RUN;

方式2:RETAIN保留优先级取值

通过RETAIN变量记录当前ID的最高优先级,最后输出每个ID的最终取值:

DATA result;
    SET original_table;
    BY ID;
    RETAIN COL1;
    /* 初始化当前ID的COL1 */
    IF FIRST.ID THEN COL1 = GROUP;
    /* 若遇到PRI则更新为PRI */
    ELSE IF GROUP = 'PRI' THEN COL1 = 'PRI';
    /* 仅输出每个ID的最后一条记录 */
    IF LAST.ID THEN OUTPUT;
    KEEP ID COL1;
RUN;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:51:52