SAS 修改 and/or 用更新的数据替换主数据

SAS Modify and/or Replace Master Data with Updated Data

我有两个数据集 -- 一个主数据集,需要用另一个数据集中包含的最新数据定期更新。我一直在玩弄 MODIFY 语句,但我无法完全替换数据组。下面的代码创建了两个示例数据集:

data new;
    input year dqtr age yearq;
    datalines;
    2011    4   43  20114
    2011    4   25  20114
    2013    1   52  20131
    2013    1   45  20131
    2013    2   72  20132
    2013    2   43  20132
    2013    3   93  20133
    2013    3   97  20133
    2013    4   23  20134
    2013    4   37  20134
;
run;

data master;
    input year dqtr age yearq;
    datalines;
    2011    3   94  20113
    2011    3   76  20113
    2011    3   56  20113
    2011    4   43  20114
    2011    4   62  20114
    2011    4   73  20114
;
run;

变量 YEARQ 是 YEAR 和 DQTR 的串联变量。如果 YEARQ 组合不在主数据集中,则应将其附加。如果它在主数据集中,那么它应该替换整个组。例如,只有 YEARQ=20114 应该在最终数据集中。原来的 3 个 20114 obs 应该换成 2 个新的 20114 obs。下面的代码几乎可以满足我的要求,但是 YEARQ 的整个组都没有被替换(它只替换了第一个,但是发现了该组合的许多观察结果):

data master(index=(yearq)); 
    set master;
run;

data master;
    set new;
    modify master key=yearq;
   if _iorc_ =0 then replace;
   else do; 
         _error_=0;       
         _iorc_=0;  
      output;  
      end;
run;

正如我看到的您的 update 过程,基本上您正在尝试做的是遵循

  1. 如果您的 new 数据集包含一个现有的 yearq 值,那么您将在 master 数据集中更新它,即从 [=16] 中删除所有常见的 yearq =] 并将新的 yearqnew 附加到 master
  2. 您还将任何新的 yearq 附加到 master 数据集。

提取常用yearq

proc sql;
create table common as select distinct(a.yearq) from master as a, new as b
where a.yearq=b.yearq;
quit;

正在从 master

中删除公共 yearq
proc sql;
create table temp as select * from master where yearq not in(select yearq from common);
quit;

new 数据集附加到 master 数据集

data master;
set temp
    new;
    run;