用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;
代码说明
- 排序步骤:数据步的
BY分组要求数据集按分组字段有序,因此先对源数据排序;如果源数据集本身已经按TRFFIC_NO有序,可省略此步骤以提升效率。 - 分组初始化:利用
first.TRFFIC_NO标识每组的第一条记录,此时将四个统计计数器初始化为0。 - 区间判断与累加:逐条检查
ticket_date_v1所属的时间区间,对对应计数器进行累加(SAS中变量+1的方式会自动保留变量值,无需额外retain)。 - 输出汇总:利用
last.TRFFIC_NO标识每组的最后一条记录,此时输出该组的统计结果,确保每组只输出一条汇总记录。 - 变量保留:通过
keep语句只保留需要的分组字段和统计字段,减少输出数据集的冗余。
内容的提问来源于stack exchange,提问作者Rakesh Das
相关产品推荐
相关产品推荐

