嗨,大家好,我需要合并在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 ...
有财产以后这样呢?
如果没有,你能告诉我,我怎么能做出这种有附加条件的?
我不知道这样做的任何直接的方式。 当我在过去已经做了我第一次追加新行(使用proc append
),然后有第二个步骤来modify
现有行。 对于修改步骤中,您需要使用datastep的组合与set
和modify
,如果你想重建表中,在一个单一datastep声明。 这样做的好处是,它是少了很多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;
我要补充一点,如果性能是不是你好得多的问题只是重新从头开始创建表。
您可以使用MODIFY插入新行以及替换现有的数据。 该代码会是这个样子(我不能没有知道你是什么样的匹配上任何其他条件,你可能有更具体的)。 作为一个独立的查找,对主数据集在交易数据集的每一行进行警告,只是一个字,如果两个你的数据集都大,那么以这种方式使用MODIFY是非常低效的。 使用索引,如@罗布的解决方案,将提高在这种情况下的性能。 替代方案,如@Rob说,是使用UPDATE(类似修改此处),或者只是一个标准的MERGE,这两者取代现有的数据集,而不是就地修改。 最后一个选择是使用SQL PROC在那里你可以使用类似于当前的代码的东西。
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;