希望有疑问的朋友提出问题,大家一起学习进步,以后我也会多多的写自己的例子
update语句
UPDATE master-data-set<(data-set-options)> transaction-data-set<(data-set-options)>
<END=variable>
<UPDATEMODE= MISSINGCHECK | NOMISSINGCHECK>;
BY by-variable;
TIPS:
1:后面只能跟两个数据集,且一定要和by语句连用,这个by语句给出了主数据集和更新数据集共同变量的名字。
2:update语句中使用的数据集必须实现按照by语句制定的变量进行排序,或者已经有合适的索引
3:对更新数据集存在缺失值的处理通过开关选项UPDATEMODE实现
MISSINGCHECK:检查更新数据集,若有缺失值,则保留主数据及中相应的数据
NOMISSINGCHECK:不检查更新数据集,若有缺失值,则将主数据集中的相应数据更新为缺失值
4:update能做到的merge都能做到,除了对更新数据及缺失值的处理。
modify语句
merge和update语句对数据集横向合并的主要功能只能体现在匹配访问上(by var;),但是对于非常庞大的数据集需要定期更新,但是每次更新的观测值对象都是动态的,这时候使用merge或update会消耗很多的资源,这时候可以通过modify高效的访问机制来实现。使用modify《系统会有两个pdv》
modify的四种格式
Form 1:
MODIFY master-data-set <(data-set-options)> transaction-data-set <(data-set-options)>
<NOBS=variable> <END=variable>
<UPDATEMODE=MISSINGCHECK | NOMISSINGCHECK>;
BY by-variable;
Form 2:
MODIFY master-data-set <(data-set-options)> KEY=index </ UNIQUE> <NOBS=variable>
<END=variable>;
Form 3:
MODIFY master-data-set <(data-set-options)> <NOBS=variable> POINT=variable;
Form 4:
MODIFY master-data-set <(data-set-options)> <NOBS=variable> <END=variable>;
例子:
data stock(index=(partno)); input PARTNO $ DESC $ INSTOCK @17 RECDATE date7. @25 PRICE; format recdate date7.; datalines; K89R seal 34 27jul95 245.00 M4J7 sander 98 20jun95 45.88 LK43 filter 121 19may96 10.99 MN21 brace 43 10aug96 27.87 BC85 clamp 80 16aug96 9.55 NCF3 valve 198 20mar96 24.50 KJ66 cutter 6 18jun96 19.77 UYN7 rod 211 09sep96 11.55 JD03 switch 383 09jan97 13.99 BV1E timer 26 03jan97 34.50 ; run; /*直接改变所有的recdate变量观测值,可以不用任何更新数据集*/
data stock;
modify stock;
recdate=today();
run;
proc print data=stock noobs;
title ‘INVTY.STOCK‘;
run;
/*用更新数据集更新主数据集,使用匹配访问,更新数据集放在主数据集后面*/
data stock;
modify stock addinv;
by partno;
RECDATE=today();
INSTOCK=instock+nwstock;
if _iorc_=0 then replace;
run;
proc print data=stock noobs;
title ‘STOCK‘;
run;
data newp; input TOOL_OBS NEWP; datalines; 1 251.00 2 49.33 3 12.32 4 30.00 5 15.00 6 25.75 7 22.00 8 14.00 9 14.32 10 35.00 ;/*通过观测序号来访问,先set数据集再进行改变*/
data stock;
set newp;
modify stock point=tool_obs nobs=max_obs;
price=newp;
recdate = today();
run;
/*通过索引进行访问,先set数据集再进行改变*/
data stock;
set addinv;
modify stock key=partno;
INSTOCK=instock+nwstock;
RECDATE=today();
if _iorc_=0 then replace;
run;
proc print data=stock noobs;
title ‘INVTY.STOCK‘;
run;
/*对于更新数据集有重复值的情况*/
data newinv; input PARTNO $ NWSTOCK; datalines; K89R 55 M4J7 21 M4J7 26 LK43 43 MN21 73 BC85 57 NCF3 90 KJ66 2 UYN7 108 JD03 55 BV1E 27 ;
data stock; set newinv; modify invty.stock key=partno / unique; /*使用unique则会对m4j7的值进行累加,不用就只会加第一个*/ INSTOCK=instock+nwstock; RECDATE=today(); if _iorc_=0 then replace; run; proc print data=stock noobs; title ‘Results of Using the UNIQUE Option‘; run;