假设我在库lib
中有一些数据集,它们的名称看起来像Table_YYYYMMDD
(例如Table_20150101
)。
我想获得一个具有最大日期(YYYYMMDD)的数据集的名称,并将其存储在宏变量中。
我正在使用proc sql
和from dictionary.tables
。
首先,我提取名称的YYYYMMDD
部分。然后我应该将它转换为日期,然后找到MAX。我想确保我在库中至少有一个数据集。
proc sql;
select put(MAX(input(scan(memname, 2, '_'), yymmdd8.)), yymmddn8.)
into :mvTable_MaxDate
from dictionary.tables
where libname = 'LIB';
quit;
所以,
在scan
中使用proc sql
等sas函数是否正确?
如何检查查询是否为空(mvTable_MaxDate没有缺少值)?
感谢您的帮助:)
答案 0 :(得分:1)
错误的原因是你正在使用INPUTN()函数,它希望第二个参数是文本文字或变量的名称。如果更改为INPUT(),则可以避免错误。
另请注意,您需要在where子句中更新库名称的文字值。 Dictionary.tables以大写形式存储libnames。
如上所述,宏变量的值将是SAS日期值。如果您希望它格式化为YYMMDDN8。你需要添加它。
以下是一个例子:
74 data a_20151027
75 a_20141022
76 a_20130114
77 ;
78 x=1;
79 run;
NOTE: The data set WORK.A_20151027 has 1 observations and 1 variables.
NOTE: The data set WORK.A_20141022 has 1 observations and 1 variables.
NOTE: The data set WORK.A_20130114 has 1 observations and 1 variables.
80
81 proc sql noprint;
82 select COALESCE(MAX(input(scan(memname, 2, '_'), yymmdd8.)), 0)
83 into :mvTable_MaxDate
84 from dictionary.tables
85 where libname = 'WORK';
86 quit;
87
88 %put &mvTable_MaxDate;
20388
89 %put %sysfunc(putn(&mvTable_MaxDate,yymmddn8));
20151027
作为侧面评论,如果您可以将所有数据合并到一个数据集中,并将数据集名称日期后缀存储为变量,那么通常生活会变得更加轻松。