如何按日期升序检索并排序SAS中指定格式的表名列表
SAS表名按日期升序排列解决方案
问题背景
现有格式为BRANCH_AQB_INDIA_<月份缩写><年份>_MAIN的SAS表名:
BRANCH_AQB_INDIA_NOV2022_MAIN BRANCH_AQB_INDIA_FEB2023_MAIN BRANCH_AQB_INDIA_SEP2023_MAIN BRANCH_AQB_INDIA_AUG2022_MAIN BRANCH_AQB_INDIA_APR2023_MAIN BRANCH_AQB_INDIA_JAN2024_MAIN
期望按日期升序排列为:
BRANCH_AQB_INDIA_AUG2022_MAIN BRANCH_AQB_INDIA_NOV2022_MAIN BRANCH_AQB_INDIA_FEB2023_MAIN BRANCH_AQB_INDIA_APR2023_MAIN BRANCH_AQB_INDIA_SEP2023_MAIN BRANCH_AQB_INDIA_JAN2024_MAIN
当前使用proc sql按memname升序排序的代码无法满足日期排序需求:
proc sql; select memname from dictionary.tables where libname = 'KALP51' and memname like 'BRANCH_AQB_INDIA_%_MAIN' order by memname asc; quit;
解决方案
核心思路是从表名中提取日期字符串,转换为SAS可识别的日期值后排序。
方法1:基于分隔符提取日期(通用场景)
利用scan函数按下划线分隔提取表名中的日期部分,再用input函数将其转换为SAS日期值,最终按该日期值升序排序:
proc sql; select memname from dictionary.tables where libname = 'KALP51' and memname like 'BRANCH_AQB_INDIA_%_MAIN' order by input(scan(memname, 4, '_'), monyy7.) asc; quit;
scan(memname, 4, '_'):提取表名中第4个下划线分隔的字段(如AUG2022)input(..., monyy7.):将提取的字符串转换为SAS日期值,monyy7.格式适配3字母月份缩写+4位年份的格式
方法2:基于固定位置提取日期(格式固定场景)
如果表名的日期部分位置固定(从第19位开始,长度为7),可以直接用substr函数提取:
proc sql; select memname from dictionary.tables where libname = 'KALP51' and memname like 'BRANCH_AQB_INDIA_%_MAIN' order by input(substr(memname, 19, 7), monyy7.) asc; quit;
substr(memname, 19, 7):从第19个字符开始提取7个字符,得到日期字符串- 转换和排序逻辑与方法1一致
内容的提问来源于stack exchange,提问作者Christal J
相关产品推荐
相关产品推荐

