SAS中文论坛

标题: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制 [打印本页]

作者: shiyiming    时间: 2009-11-29 13:13
标题: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制
版主,你好:
拜读了你之前给别人解答的一个双SET语句后,有个PDV运作机制的问题真心的请教你,望不吝赐教!你写的原程序如下:
data ahuige(drop=num1 num2);
set b;
retain num1 num2 add;
do while (not (num1<=num<=num2) and (point+1<=maxA)) ;
point+1;
set a point=point nobs=maxA;
end;
run;
proc print;
run;
但是,在我把retain num1 num2 add语句去掉后,所得结果相同,我的问题是:在双SET语句中,第二个SET语句里面的数据集所有变量是不是自动RETAIN?我们知道,在PDV里面,当程序返回DATA步开头时,系统会清空所有非RETAIN变量为缺失值,所以当程序读到数据集B的第二条观测时,按照我的理解,数据集A和B里面的所有变量由于没有RETAIN,应该被PDV清空为缺失值,是这样吗?还是数据集A里面的所有变量自动RETAIN直到在DO循环里面被更新?
另外,这里的SET/SET语句在系统里面开辟几条PDV?是一条吗?
多谢赐教!
作者: shiyiming    时间: 2009-11-30 12:43
标题: Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制
已弄明白,多谢各位!
作者: shiyiming    时间: 2009-12-1 14:55
标题: Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制
没有上下文的来看,retain估计有可能是不必要的语句。PDV应该是一个DATA步一个吧。
作者: shiyiming    时间: 2009-12-2 09:29
标题: Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制
是的,您说的没错。双SET语句虽然共用一个程序向量PDV,但是数据指针一人一个,所以RETAIN在双SET语句中对第二个SET数据集是没有任何作用的,还有第二个SET语句中的循环控制,您用的POINT=选项似乎也没有必要,一切都是数据指针在控制。我已经测试如下:
您的代码:
data ahuige(drop=num1 num2);
set b;
retain num1 num2 add;
do while (not (num1<=num<=num2) and (point+1<=maxA)) ;
point+1;
set a point=point nobs=maxA;
end;
run;
proc print;
run;
简化后的代码:
data ahuige(drop=num1 num2);
set b;

do while (not (num1<=num<=num2) ) ;

set a ;
end;
run;
proc print;
run;

不知道是不是有潜在的问题,不过它肯定比SQL的BETWEEN来得快得多!
再次感谢Ahuige!
作者: shiyiming    时间: 2009-12-2 10:26
标题: Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制
我看了一下原帖,加PIONT的原因是为了避免A数据集过短。使得B数据集后没有匹配的记录全部DROP掉了。所以强制不让DATA步过早退出,不过应该再加一句清空未匹配的ADD变量。如果用你的方式,也应该要加类似的处理,不过如果一个萝卜保证有一个坑的话。就无所谓了。

[code:30s5n6g6]
data a;
input num1 num2 add $20. ;
call symput('maxA',_n_);
cards;
0 5  bj

;
run;

proc sort ;
  by num1 num2;
run;

data b;
input id $ num;
cards;
001 8
002 9
003 43
004 1000
;
run;

proc sort ;
  by num;
run;

data ahuige(drop=num1 num2);
  set b;
  retain num1 num2 add;
  do while (not (num1<=num<=num2) and (point+1<=&maxA)) ;
    point+1;
    set  a point=point;
  end;
  if not (num1<=num<=num2 )then add='';
run;

data ahuige2(drop=num1 num2);
set b;

do while (not (num1<=num<=num2) ) ;

set a ;
end;
run;

[/code:30s5n6g6]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2