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

如何按日期升序检索并排序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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:24:51