其实把最后一段代码加几个put就比较清楚了。
两个set的时候,SAS是按顺序读完第一个set里one的一条数据之后,再读第二个set里two中的一条数据。这里由于有了if 和do 循环,在y=.的时候two的数据是读了多次的。因为do while 的条件,只要z ne z2该条数据就一直被循环覆盖。恰恰当z eq z2时,覆盖停止了,也就是取了最后的结果值。
- DATA both;
- SET one ;
- put _all_;
- N = .;
- IF y=. THEN DO WHILE (z NE z2);
- put z z2;
- put _all_;
- SET two;
- put z z2;
- put _all_;
- END;
- run;
复制代码
x=1 y=2 z=a1 N=. z2= _ERROR_=0 _N_=1
x=1 y=3 z=b1 N=. z2= _ERROR_=0 _N_=2
x=1 y=. z=c1 N=. z2= _ERROR_=0 _N_=3
c1
x=1 y=. z=c1 N=. z2= _ERROR_=0 _N_=3
c1 a1
x=1 y=2 z=c1 N=1 z2=a1 _ERROR_=0 _N_=3
c1 a1
x=1 y=2 z=c1 N=1 z2=a1 _ERROR_=0 _N_=3
c1 b1
x=1 y=3 z=c1 N=2 z2=b1 _ERROR_=0 _N_=3
c1 b1
x=1 y=3 z=c1 N=2 z2=b1 _ERROR_=0 _N_=3
c1 c1
x=1 y=4 z=c1 N=3 z2=c1 _ERROR_=0 _N_=3
x=2 y=5 z=d1 N=3 z2=c1 _ERROR_=0 _N_=4
x=4 y=6 z=e1 N=. z2=c1 _ERROR_=0 _N_=5
NOTE: 从数据集 WORK.ONE. 读取了 5 个观测
NOTE: 从数据集 WORK.TWO. 读取了 3 个观测
NOTE: 数据集 WORK.BOTH 有 5 个观测和 5 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 0.06 秒
CPU 时间 0.04 秒