大家好我需要在Sas中合并两个表
但是有一个类似于sql merge语句的条件:
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 ...
有类似的东西?
如果没有,你能不能告诉我怎么能以条件进行这种追加?
答案 0 :(得分: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;
答案 1 :(得分:0)
我不知道有任何简单的方法。当我在过去完成它时,我首先添加新行(使用proc append
),然后向modify
现有行添加第二步。对于修改步骤,如果要在原位重建表,则需要在单个datastep中使用datastep与set
和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;
我应该补充一点,如果性能不是问题,那么只需从头开始重新创建一个表就好了。