1

大家好,我需要在 Sas 中合并两个表

但有一个条件,如 sql 合并语句:

MERGE INTO TABLE_NAME USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...

有类似的东西吗?

如果没有你能告诉我我怎样才能使这种附加条件?

4

2 回答 2

1

您可以使用 MODIFY 插入新行以及替换现有数据。代码看起来像这样(如果不知道您匹配的是什么以及您可能拥有的任何其他条件,我无法更具体)。只是一个警告,如果您的两个数据集都很大,那么以这种方式使用 MODIFY 是非常低效的,因为针对事务数据集中的每一行的主数据集执行单独的查找。在@Rob 的解决方案中使用索引将提高这种情况下的性能。正如@Rob 所说,替代方案是使用 UPDATE(类似于此处的 MODIFY)或仅使用标准 MERGE,这两者都替换现有数据集而不是就地修改。最后一个选择是使用 PROC SQL,您可以在其中使用与当前代码类似的东西。

data master;
modify master (in=a) transaction (in=b);
by id;
if not a and <condition> then do;
    _error_=0;
    output;
    end;
else if a and b and <condition> then replace;
run;
于 2012-08-01T08:05:01.210 回答
0

我不知道有任何直接的方法可以做到这一点。当我过去完成它时,我首先附加新行(使用),然后对现有行proc append进行第二步。对于修改步骤,如果要就地重建表,则需要在单个数据modify步骤中使用数据步骤与 aset和语句的组合。modify这样做的好处是它的 I/O 少得多(如果它是一个大表并且只有一小部分要更新)并且它保留了现有的索引。缺点是它要复杂得多。代码看起来像这样:

  **
  ** REPLACE VALUES IN CPANEL.PW_STAT WITHOUT REBUILDING THE ENTIRE TABLE.
  *;
  data cpanel.pw_stat;

    set redirect_updates;
    modify cpanel.pw_stat key=primary;

    select(_iorc_);  
      when(%sysrc(_sok)) do;
        * MATCHED TRANSACTION DATASET TO MASTER DATASET. REPLACE THE VALUE;
        if date_redirected ne tmp_date_redirected then do;
          date_redirected = tmp_date_redirected;
          replace;
        end;
      end;
      when(%sysrc(_dsenom)) do;
        * NO MATCH. DO NOT ADD OBS OR REPLACE OBS OR DELETE OBS.  RESET ERR AND DO NOTHING.;
        _error_ = 0;
      end;
      otherwise do;
        put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
        put 'Program terminating. DATA step iteration # ' _n_;
        put _all_;
        stop;
      end;
    end;
  run;

我应该补充一点,如果性能不是问题,那么从头开始重新创建一个表会更好。

于 2012-07-31T20:00:32.097 回答