宏Do循环在RSUBMIT中无法正常工作

时间:2016-01-29 21:56:17

标签: sas sas-macro

所以我的代码适用于一年,但我需要将其转换为循环,因此它可以在1970年到2015年间使用。

以下是我在%let语句中指定的1年代码。

%let year=1970
rsubmit; 
data home.historical_returns_&year;
set home.crspdata;
where (year <= &year - 1) and (year >= &year - 5);
returns_count + 1;
by id year;
if first.id or missing(tot_ret) then returns_count = 1;
run;
endrsubmit;

到目前为止,该代码对我来说非常有用。现在,我试图使用一个循环,所以我在1970年到2015年这样做。

我想出了这个。看起来效果很好,但年份保持在1970年。

%macro GMV;
rsubmit;
%do year=1970 %to 2015;
data home.historical_returns_&year;
set home.crspdata;
where (year <= &year - 1) and (year >= &year - 5);
returns_count + 1;
by id year;
if first.id or missing(tot_ret) then returns_count = 1;
run;
%end;
endrsubmit;

%mend GMV;

%GMV

在日志中,我看到名称中的&amp; year实际上从1970年到1971年到1972年实际上没有变化,依此类推。所以我最终得到了我需要的45种不同的数据集。

有人遇到过这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您将远程处理与本地处理混合在一起会导致此类问题。你的宏变量不会被更新(我有点意外,并没有对个人的class aProvider(implicit dbConfig: DatabaseConfig[JdbcPRofile]) { def save(v: Visitor): ApiResponse[VisitorId] } 循环产生错误。)

%do

将整个宏放在rsubmit中以获得您正在寻找的结果 - 或者将整个rsubmit放在宏中(在我看来,这不是一个好主意,尽管Tom在评论中指出它可能是在某些情况下更安全的选择)。

答案 1 :(得分:1)

如果要在RSUBMIT的代码中引用宏变量,则宏变量需要存在于远程会话中。

%macro GMV(start,end);
   %local year;
   %do year=&start %to &end;
      %syslput year=&year;
      rsubmit;
       data home.historical_returns_&year;
         set home.crspdata;
         by id year;
         where (year <= &year - 1) and (year >= &year - 5);
         returns_count + 1;
         if first.id or missing(tot_ret) then returns_count = 1;
       run;
     endrsubmit;
   %end;
 %mend GMV;

 %GMV(1970,2015);