You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SAS宏的DO循环中传入两个动态日期参数?

解决SAS宏循环传入两个动态日期参数的问题

情况1:相邻日期配对(如第i个日期和第i+1个日期比较)

不需要额外添加独立的%DO j循环,直接在现有循环中通过%eval(&i+1)获取下一个日期对应的宏变量即可,修改后的代码如下:

%MACRO APPLY_TEST;
%DO i = 4 %to 27 %by 1;
  %test (date1=&MMMYY&&i., date2=&MMMYY%eval(&i+1));
%end;
%mend;

%APPLY_TEST;

代码说明

  • &MMMYY&&i.:解析为&MMMYY4、&MMMYY5…&MMMYY27,获取当前循环对应的日期值(如Sep23)。
  • &MMMYY%eval(&i+1):先通过%eval(&i+1)计算出下一个索引(如i=4时得到5),再解析为&MMMYY5,获取对应的下一个日期值(如Oct23)。

情况2:所有两两日期组合(如第i个日期和所有后续日期比较)

如果需要生成所有不重复的两两日期配对,就需要嵌套%DO j循环,让j从i+1开始遍历到28,代码如下:

%MACRO APPLY_TEST;
%DO i = 4 %to 27 %by 1;
  %DO j = %eval(&i+1) %to 28 %by 1;
    %test (date1=&MMMYY&&i., date2=&MMMYY&&j.);
  %end;
%end;
%mend;

%APPLY_TEST;

注意事项

原%test宏每次执行都会覆盖WANT数据集,最终只会保留最后一次循环的结果。如果需要保留所有比较结果,建议修改%test宏,给输出数据集添加日期标识:

%macro test (date1, date2);
DATA WANT_&date1._&date2.;
SET HAVE;
IF INPUT_&DATE1. > INPUT_&DATE2. THEN R_&DATE1. = 1; ELSE R_&DATE2. = 0;
RUN;
%MEND;

这样每次生成的数据集名为WANT_日期1_日期2(如WANT_Sep23_Oct23),避免数据覆盖。


内容的提问来源于stack exchange,提问作者MLPNPC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:52:32