基于SAS中日期值的宏变量创建

时间:2014-04-04 07:50:45

标签: date macros sas

我有一个公司ID和日期列表,我希望在这个列表上运行一个宏,这样每个日期都需要将所有公司ID都视为我的宏过滤器。

例如,我的列表是 -

 DATA comp_date_list;
   INPUT compno sdate;
   DATALINES;
    12490 20090120
    87432 20090120
    24643 20090120
    87432 20090119
    12490 20090105
    24643 20090105
    ;
    proc print data=comp_date_list;
    run;

现在,我有一个如下的宏 -

%macro1(compno=,sdate=,threshold=,fdate=,edate=)

现在,宏必须为列表中的每个comp-date组合运行。但由于这是在非常大的数据集上运行,因此运行n次需要很长时间。因此,为了减少运行时间,我计划为给定日期创建一个compnos列表并更改我的宏以生成日期的结果。

现在我的问题是如何创建一个宏变量,其中包含给定日期的所有compnos,并且会更改为日期更改?我是宏写作和SAS的新手。请原谅我的无知。谢谢!

1 个答案:

答案 0 :(得分:1)

datastep中的call execute语句可以在调用它的datastep之后运行选择性代码(在本例中为宏)。例如,以下内容适用于您: -

proc sort data = comp_date_list;
  by sdate compno;
data _null_;
  set comp_date_list;
  by sdate;

  attrib all_comps_on_date length=$1000 label="All_comps_on_date: '|' separated company numbers for date";
  retain all_comps_on_date "";

  if first.sdate then all_comps_on_date = '';
  all_comps_on_date = catx('|', all_comps_on_date, compno);
  if last.sdate then call execute('%macro1(compno='||strip(all_comps_on_date)||',sdate=,threshold=,fdate=,edate=)');
run;

但请注意; call execute可以对自己创建宏变量的宏造成严重破坏(特别是如果他们正在使用call execute语句!)

我只能回应@ChrisJ并补充一点,虽然SAS宏很有用,维护和调试它们很痛苦,我只把它们作为最后的手段。当然对遗留代码没什么帮助!