如何从SAS库中获取最新-2的指定命名规则数据表?
SAS获取排序后第三张表(最新-2表)解决方案
需求背景
已实现从SAS库KALP51中获取符合命名规则RM_RV_MONTHWISE_%_MAIN的最新表和最新-1表,现需获取按表名中倒数第二个下划线分隔的月份字段降序排序后的第三张表(即最新-2表,存在月份缺失情况,非固定上月的上月)。
解决方案
方法1:PROC SQL子查询生成行号筛选
通过子查询为每个符合条件的表按月份降序生成行号,直接筛选行号为3的记录:
proc sql; select memname from ( select memname, row_number() over(order by input(scan(memname, -2, '_'), monyy7.) desc) as rn from dictionary.tables where libname = 'KALP51' and memname like 'RM_RV_MONTHWISE_%_MAIN' ) where rn = 3; quit;
- 说明:子查询中
row_number()函数会按月份降序为每个表分配唯一行号,rn=1对应最新表,rn=2对应最新-1表,rn=3即为目标的最新-2表,不受月份缺失影响。
方法2:DATA步骤+PROC SORT定位行
先提取符合条件的表信息,排序后直接取第三行:
/* 提取符合规则的表信息 */ data table_list; set sashelp.vtable; where libname = 'KALP51' and memname like 'RM_RV_MONTHWISE_%_MAIN'; /* 解析表名中的月份字段 */ month_dt = input(scan(memname, -2, '_'), monyy7.); format month_dt monyy7.; run; /* 按月份降序排序 */ proc sort data=table_list; by descending month_dt; run; /* 获取第三行数据(最新-2表) */ data latest_minus_2; set table_list(firstobs=3 obs=3); run; /* 输出结果 */ proc print data=latest_minus_2; var memname month_dt; run;
- 说明:
firstobs=3 obs=3指定仅读取排序后的第三行数据,精准获取目标表。
注意事项
原代码中libname = KALP51'存在语法错误,需修正为libname = 'KALP51'(前后均加单引号),否则会导致SQL执行报错。
内容的提问来源于stack exchange,提问作者Vasant Raval
相关产品推荐
相关产品推荐

