如何在SAS SQL中对所有A类列使用substr函数并逆序排序
SAS SQL实现按列名数字部分降序排序
解决方法
核心是正确提取列名中的数字部分并转为数值,再按数值降序排序。以下是具体实现:
1. 查询并排序列名(从元数据字典表)
如果需要查看排序后的列名列表,可从SAS元数据字典表(如sashelp.vcolumn)查询:
proc sql; select name as variable_name from sashelp.vcolumn where libname = 'WORK' /* 替换为你的库名 */ and memname = 'YOUR_DATA' /* 替换为你的数据集名 */ order by input(substr(name, 2), 8.) desc; /* 提取第2位开始的数字,转数值后降序 */ quit;
2. 将排序后的列名存入宏变量(用于后续数据处理)
如果需要将排序后的列用于keep、select等操作,可把结果存入宏变量:
proc sql noprint; select name into :sorted_columns separated by ' ' from sashelp.vcolumn where libname = 'WORK' and memname = 'YOUR_DATA' order by input(substr(name, 2), best.) desc; quit; /* 示例:保留排序后的列生成新数据集 */ data sorted_result; set YOUR_DATA; keep &sorted_columns; run;
关键细节说明
substr(name, 2):针对A1、A2这类前缀为单字符的列名,从第2个字符开始提取数字部分;如果列名前缀是多字符(如AB12),可改用正则表达式提取数字:input(prxchange('s/[^0-9]//', -1, name), best.)input(..., 8.):必须指定数值格式,将提取的字符型数字转为数值型,否则排序会按字符顺序(如10会错误排在2前面)- 库名和数据集名需大写:SAS元数据字典表中的库名、数据集名默认以大写存储
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

