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

用SAS数据步替代Proc SQL中Case语句实现分组统计需求

用SAS数据步替代Proc SQL实现分组统计需求

原Proc SQL代码实现的功能是:按TRFFIC_NO(注:原代码拼写为TRFFIC_NO,疑似TRAFFIC_NO笔误,以下保留原拼写)分组,统计不同时间区间内的违规记录数。针对大数据量场景,改用SAS数据步实现相同逻辑的代码如下:

/* 先按分组字段排序,数据步分组依赖有序数据集 */
proc sort data=public.RTA_NDP_Red_1 out=RTA_NDP_Red_sorted;
    by TRFFIC_NO;
run;

/* 数据步分组统计 */
data RTA_NDP_Red_2;
    set RTA_NDP_Red_sorted;
    by TRFFIC_NO;
    /* 每组第一条记录时初始化计数器 */
    if first.TRFFIC_NO then do;
        NDP_vio_cnt_t1 = 0;
        NDP_vio_cnt_t2 = 0;
        NDP_vio_cnt_t3 = 0;
        NDP_vio_cnt_t4 = 0;
    end;
    /* 判断当前记录所属时间区间,累加对应计数器 */
    if ticket_date_v1 between '01OCT2019'd and '30SEP2020'd then NDP_vio_cnt_t1 + 1;
    else if ticket_date_v1 between '01OCT2018'd and '30SEP2019'd then NDP_vio_cnt_t2 + 1;
    else if ticket_date_v1 between '01OCT2017'd and '30SEP2018'd then NDP_vio_cnt_t3 + 1;
    else if ticket_date_v1 lt '01OCT2017'd then NDP_vio_cnt_t4 + 1;
    /* 每组最后一条记录时输出汇总结果 */
    if last.TRFFIC_NO then output;
    /* 只保留分组字段和统计字段 */
    keep TRFFIC_NO NDP_vio_cnt_t1 NDP_vio_cnt_t2 NDP_vio_cnt_t3 NDP_vio_cnt_t4;
run;

代码说明

  1. 排序步骤:数据步的BY分组要求数据集按分组字段有序,因此先对源数据排序;如果源数据集本身已经按TRFFIC_NO有序,可省略此步骤以提升效率。
  2. 分组初始化:利用first.TRFFIC_NO标识每组的第一条记录,此时将四个统计计数器初始化为0。
  3. 区间判断与累加:逐条检查ticket_date_v1所属的时间区间,对对应计数器进行累加(SAS中变量+1的方式会自动保留变量值,无需额外retain)。
  4. 输出汇总:利用last.TRFFIC_NO标识每组的最后一条记录,此时输出该组的统计结果,确保每组只输出一条汇总记录。
  5. 变量保留:通过keep语句只保留需要的分组字段和统计字段,减少输出数据集的冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:51:35