SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 654|回复: 4
打印 上一主题 下一主题

请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-11-29 13:13:46 | 只看该作者

请教斑竹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?是一条吗?
多谢赐教!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-11-30 12:43:24 | 只看该作者

Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制

已弄明白,多谢各位!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-1 14:55:03 | 只看该作者

Re: 请教斑竹Ahuige一个关于双SET语句在PDV流程中的运作机制

没有上下文的来看,retain估计有可能是不必要的语句。PDV应该是一个DATA步一个吧。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-2 09:29:49 | 只看该作者

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!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-2 10:26: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]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 06:26 , Processed in 0.068220 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表