Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS宏以获取所需范围的输出_Sas - Fatal编程技术网

SAS宏以获取所需范围的输出

SAS宏以获取所需范围的输出,sas,Sas,我是SAS的新手。请帮忙回答我的问题。 在我定义的某个日期,我的代码可以正常工作 %let yyyymmdd= 20020509; data x; set PQ.CP_&yyyymmdd 然后是获得所需输出的条件 现在,我希望我的代码在yyyymmdd之前的startrange=-50天和yyyymmdd之前的endrange=-10天之间工作。我如何在开始时定义它,以获得这段时间的输出,因为我想进一步使用它。请给我一个建议 好的-我是在你的上下文中回答这个问题的-要解决当前的问题

我是SAS的新手。请帮忙回答我的问题。 在我定义的某个日期,我的代码可以正常工作

%let yyyymmdd= 20020509; 
data x;
set PQ.CP_&yyyymmdd 
然后是获得所需输出的条件


现在,我希望我的代码在yyyymmdd之前的startrange=-50天和yyyymmdd之前的endrange=-10天之间工作。我如何在开始时定义它,以获得这段时间的输出,因为我想进一步使用它。请给我一个建议

好的-我是在你的上下文中回答这个问题的-要解决当前的问题,请忽略下面的“内部循环”:

%macro loop(yyyymmdd=, startrange=, endrange=);
%local date x ds1 ds2 y;
%let date=%sysfunc(mdy(%substr(&yyyymmdd,5,2)
                      ,%substr(&yyyymmdd,7,2)
                      ,%substr(&yyyymmdd,1,4)));

/* this outer loop answers the curent question */
%do x=&startrange %to &endrange;
   %let ds1=PQ.CP_%sysfunc(intnx(day,&date,&x),yymmddn8.);
   %if %sysfunc(exist( &ds1 )) %then %do;
      data x_%sysfunc(intnx(day,&date,&x),yymmddn8.);
      set &ds1
      /* this inner loop answers your previous question - remove if necessary */
      %do y=-55 %to -10;
         /* next date range is 55 to 10 days BEFORE the current iterative*/
         /* value of (startrange-endrange) */
         %let ds2=QA.TP_%sysfunc(intnx(day,&date,%eval(&y+&x)),yymmddn8.);
         %if %sysfunc(exist( &ds2 )) %then %do;
            &ds2
         %end;
      %end;
      /* inner loop end */
      ;run;
   %end;
%end;
/* outer loop end */
%mend; 

%loop(yyyymmdd=20020509, startrange=-50, endrange=-10);

谢谢,但是我得到了这个错误:%SYSFUNC或%QSYSFUNC宏函数引用的函数INTNX的参数3不是一个数字。谢谢,它工作得很好,但现在我还有两个疑问。如果您觉得我的问题很蹩脚,很抱歉,但我如何将问题中提到的代码用于您的问题。更清楚地说,假设%let yymmdd=20020509和%let new=startrange to endrange。我的代码在yymmdd中运行良好,我得到了输出。在我的最终声明中,仅通过将&yymmdd更改为&new,如何获得输出。谢谢你的指导和帮助!我认为如果你能提供一个(或两个)你期望的输出(对于给定的输入)的例子,你的问题会有很大的改进(并且更容易回答)。具体来说,您希望在set语句中看到哪些数据集?有多少输出数据集?好的,我理解你的观点,但请回答这个简单的问题。你的循环代码和我的过滤器配合得很好;设置和;空白处应该有什么?我试过使用end range、startrange、ds1等,但不起作用。我没有使用内部循环。