sas数据操作update、modify by ke=、控制modify的更新、datasets添加约束条件、操作文件变动aduit trail...

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都能做到,除了对更新数据及缺失值的处理

5:master数据集中的by组变量必须为unique,如果有重复只会对第一个进行更新,如果transaction中的数据有重复,则会用by group的最后一个队master数据集中的进行更新。

 

 

modify语句

 

2.1:更改数据集中所有观测行的值

DATA SAS-data-set;
  MODIFY SAS-data-set; /*数据集名字要一样*/
  existing-variable = expression;
/*run前一步的默认操作不是output是replace*/ RUN;

比较modify与sql中update的效率

因为modify数据时不会进行数据的拷贝,所以这个地方可以有一定的加速

data test;
    set SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP SASHELP.GEOEXP;
run;

/*在我机器上modify比update普遍快0.3秒,这里有三十几万行的数据*/
proc sql; update test set x=x+1000; quit; data test; modify test; x = x-1000; run;

 

 

2.2:利用transaction data更行master data

 更新by组中与master对应的观测行的数据,运行时程序内部会自动生成一个dynamic where查询语句

DATA SAS-data-set;
    MODIFY SAS-data-set transaction-data-set UPDATEMODE=MISSINGCHECK | NOMISSINGCHECK;
    BY key-variable;
RUN;

MISSINGCHECK  阻止缺失值更新主数据集
NOMISSINGCHECK  opposite way
 

对于带重复值的情况sas怎么处理?

如果是master带重复值,则只会更新重复值的第一条

如果是transaction带重复值,则会用transaction by组中的最后一条更新master的数据

如果都带重复值、、、那更新还有啥意思、、、、

对于transaction有缺失值的情况sas怎么处理?

不会用缺失值更新,除非该缺失值使用missing规定的特殊缺失值

 

 

2.3:利用索引更新数据集

和by一样,缺失值不会自动覆盖

data cargo99;
    set sasuser.newcgnum (rename =
        (capcargo = newCapCargo
        cargowgt = newCargoWgt
        cargorev = newCargoRev));

    modify cargo99 key=flghtdte;
        capcargo = newcapcargo;
        cargowgt = newcargowgt;
        cargorev = newcargorev;
run;    
/*car99是要更新的数据集,set是transaction数据集*/

如果是master带重复值,则只会更新重复值的第一条

如果是transaction带重复值且重复值不连续,则会用transaction by组中的最后一条更新master的数据

如果连续,则会进行按位置的11对应,然后在log中报错。可以用unique选项来抑制错误(用unique后得到的结果和非连续的一样!)

如果都带重复值、、、那更新还有啥意思、、、、

 

 

3:控制modify 的 update process

3.1:modify的更新是根据你自己规定的条件来进行,并进行默认的replace

我们可以用 output replace remove 来对输出进行控制

 

 

3.2:I/O错误监控

modify的by和key=形式都不输入顺序读取,所以不能保证数据结合的正确性,这时很必要进行错误检查

自动变量_iorc_是在modify的by和key=的形势下才产生的

根据_iorc_的不同形式来进行不同的输出操作

IF_IORC_=%SYSRC(mnemonic) THEN...

 

data master;
set transaction;
modify master key = id;
    if _IORC_=%sysrc(_sok) then
        do;
            a = b;
            replace;
        end;
    else
    if _IORC_=%sysrc(_dsenom) then
        do;
        output;
        _ERROR_ = 0;
    end;
run;            

 

4:约束条件

4.1:添加约束条件

在建表的同时建立约束条件必须使用proc sql

使用proc datasets在已存在的数据集上建立约束条件

对于unique和primary key选项,sas会自动建立索引

当拷贝数据集时,大部分的操作都会拷贝相应的限制条件

proc datasets nolist;
modify capinfo;
    ic create PKIDInfo=primary key(routeid)
        message='You must supply a Route ID Number';
    ic create Class1=check(where=(cap1st<capbusiness or capbusiness=.))
        message='Cap1st must be less than CapBusiness';
quit;

 

4.2:查看约束条件

proc contents data=xxx;

 

proc datasets lib=libref;

contents data=;

quit;

 

4.3:删除约束条件

proc datasets;
    modify capinfo;
        ic delete pkidinfo;
        ic delete class1;
quit;

 

5:追踪观测值的变动

when you may want to track the changes that you make by using an audit trail(添加,删除,或者更改等等)

An audit trail is an optional SAS file that logs modifications to a SAS table

5.1:创建audit

 

proc datasets nolist;
    audit capinfo;
    initiate;
quit;

5.2:读取aduit文件

To refer to the audit trail file, use the TYPE= data set option.

proc contents data=mylib.sales (type=audit);
run;
proc print data=capinfo (type=audit);
run;

 

5.3:操作aduit trail文件

该类文件包含三类变量

? data set variables that store copies of the columns in the audited SAS data set
? audit trail variables that automatically store information about data modifications
? user variables that store user-entered information.

5.3.1:自动变量以AT开头

 特别解释下_ATOPCODE_,他包含的值如下

 

When you initiate an audit trail, options in the LOG statement determine the type of entries stored in the audit trail

proc datasets nolist;
audit capinfo;
    initiate;
    log data_image=NO before_image=NO;
quit;

 

5.3.2:用户变量

User variables are unique in SAS in that they are stored in one file (the audit file) and opened for update in another file (the data set)

proc datasets nolist;
audit capinfo;
initiate;
    user_var     who $20 label = 'Who made the change'
                why $20 label = 'Why the change was made';
quit;

 

 

 

转载于:https://www.cnblogs.com/yican/p/3799883.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值