通过proc SQL获取名称中包含最大日期的数据集

时间:2015-10-29 10:40:25

标签: sas proc-sql

假设我在库lib中有一些数据集,它们的名称看起来像Table_YYYYMMDD(例如Table_20150101)。 我想获得一个具有最大日期(YYYYMMDD)的数据集的名称,并将其存储在宏变量中。

我正在使用proc sqlfrom 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;

所以,

  1. scan中使用proc sql等sas函数是否正确?

  2. 如何检查查询是否为空(mvTable_MaxDate没有缺少值)?

  3. 感谢您的帮助:)

1 个答案:

答案 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

作为侧面评论,如果您可以将所有数据合并到一个数据集中,并将数据集名称日期后缀存储为变量,那么通常生活会变得更加轻松。