Loops 在SAS中,如何迭代两个日期,然后将它们作为外部循环插入到sql语句中?
我希望外部循环迭代日期。 内部循环经过不同的位置,然后随着位置循环的结束,然后是日期循环进行迭代。定位的内部循环工作正常 我想知道where语句要说的那句话 “t1.Date在'Date'和'date1'之间”如何创建该宏?Date和date1必须同时迭代,以便始终彼此相隔两天Loops 在SAS中,如何迭代两个日期,然后将它们作为外部循环插入到sql语句中?,loops,macros,sas,Loops,Macros,Sas,我希望外部循环迭代日期。 内部循环经过不同的位置,然后随着位置循环的结束,然后是日期循环进行迭代。定位的内部循环工作正常 我想知道where语句要说的那句话 “t1.Date在'Date'和'date1'之间”如何创建该宏?Date和date1必须同时迭代,以便始终彼此相隔两天 PROC SQL; CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/ SELECT t1.Repor
PROC SQL;
CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
t1.Type,
t1.buys,
t1.sells,
t1.Age
FROM work.candy as t1
where (t1.Date BETWEEN '14Feb2016:0:0:0'dt AND '16Feb2016:0:0:0'dt) AND
(t1.Location = "SouthFlorida");
QUIT;
data list_of_dates;
format date date9.;
do Date = '01JUL2016'd to today();
output;
end;
run;
data list_of_dates1;
format date date9.;
do Date1 = '02JUL2016'd to today();
output;
end;
run;
测试时,这两个回路分别工作。但是,当我在一起时,我一直在得到一个sas错误,这是因为“当前正在处理的引用字符串已经超过262个字符,您可能有不平衡的引号。但是我没有任何不平衡的引号,就像我说他们在测试时分开工作,但不在一起
%macro queryLoop(startDate=, i=);
%macro loop(listA, listB);
%let p = %sysfunc(countw(&FACLNBR, %str( )));
%do i=1 %to &p;
%let lista = %scan(&olista, &i, %str( ));
%let listb = %scan(&olistb, &i, %str( ));
PROC SQL;
CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
t1.Type,
t1.buys,
t1.sells,
t1.Age
FROM work.candy as t1
where (datepart(t1.Date) BETWEEN &startDate AND &startDate+2 ) AND
(t1.Location = &list);
QUIT;
%end;
%mend;
%loop(listA_1 listA_2, listB_1 listB_2);
%mend queryLoop;
data list_of_dates;
i=1;
format date date9.;
do Date = '01NOV2015'd to '01JAN2016'd;
string = catt('%queryLoop(startDate=', date, ', i=', i, ');');
call execute(string);
i+1;
output;
end;
run;
;*';*";*/;quit;run;
我认为这就是你所寻找的,基于你之前的问题,这个问题和一个有根据的猜测。你需要首先将查询包装在一个宏中,然后在创建日期时,你可以直接使用call Execute将这些日期传递给宏 请参阅下面的代码。请注意,我注释掉了调用execute,因为我显然无法运行代码
%macro queryLoop(startDate=, i=);
PROC SQL;
CREATE TABLE WORK.Report_dates&i AS /* every time the date changes/newtable*/
SELECT t1.ReportsID,
t1.Type,
t1.buys,
t1.sells,
t1.Age
FROM work.candy as t1
where (datepart(t1.Date) BETWEEN &startDate AND &startDate+2 ) AND
(t1.Location = "SouthFlorida");
QUIT;
%mend queryLoop;
data list_of_dates;
i=1;
format date date9.;
do Date = '01JUL2016'd to today();
string = catt('%queryLoop(startDate', date, ', i=', i, ');');
*call execute(string);
I+1;
output;
end;
run;
我不确定我是否理解这个问题。但是如果你要求DATE1在DATE之后两天,那么就这样做吧。
DATE1=DATE+2;
为什么你要在有datetime变量的情况下创建日期?因为你的查询没有聚合,我怀疑一个带有do循环和output语句的数据集会获得相同的结果。基本上你是将数据分组为三天的间隔,每条记录都需要在间隔内。不确定为什么要这样做,或者直接使用多标签格式或SQL查询无法更有效地解决此问题。似乎传递到开始日期的是第三列字符串中的数字,所以是startDate=20636数据库无法识别该格式。如何从第二列传入日期格式。您运行了吗?这就是SAS存储日期的方式,因此更改格式只会更改外观,而不会影响实际数据。您是对的,确实有效,错误会不断出现。我在下面的主要问题中发布了有关错误的更多信息或者我得到了。我应该发布一个新问题,还是像我那样附加在这里?我不知道TBH。如果是您的问题,请在打开MPRINT和SYMBOLGEN选项的情况下运行宏,以便您可以看到哪些代码正在传递给SAS。options MPRINT SYMBOLGEN;
您可以在communities.SAS.com上发布,以获得一个限制较少的论坛。