所以我的代码适用于一年,但我需要将其转换为循环,因此它可以在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种不同的数据集。
有人遇到过这个问题吗?
谢谢!
答案 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);