在SAS中,我有一个大表,我希望通过执行左连接(或等效)来增加来自多个小表的信息。我的逻辑需要很多步骤(即不能同时加入所有内容)。每次加入后,我想保留large_table的现有索引,充分利用它。如何重写以下代码来完成此任务?
/*Join 1*/
proc sql;
create table large_table as
select a.*, b.newinfo1
from large_table a
left join small_table1 b on a.id = b.id;
quit;
/*some logic*/
/*Join 2*/
proc sql;
create table large_table as
select a.*, b.newinfo2
from large_table a
left join small_table2 b on a.id = b.id;
quit;
/*...*/
答案 0 :(得分:1)
更好的是执行一个查询。但如果你没有这种能力,你可以选择一些。
最类似SAS的不是SQL查询,而是MODIFY
语句。这将执行左连接,并修改主数据集 - 不会替换它。您必须为此预先定义所有变量才能工作。
data class(index=(name));
set sashelp.class;
call missing(predict); *define PREDICT so it is available to be updated;
where sex='F';
run;
data classfit(index=(name));
set sashelp.classfit;
run;
data class;
modify class classfit; *only PREDICT will be appended here;
by name;
select (_IORC_); *this processes the 'left' join;
when (%sysrc(_sok)) replace; *if in master then replace;
when (%sysrc(_dsenmr)) delete; *if not in master then delete;
otherwise abort;
end;
run;
proc contents data=class;
run;
您可以使用UPDATE
语句在SQL中执行类似的操作。
proc sql;
update class
set predict = (
select predict from classfit
where class.name=classfit.name
);
quit;
proc contents data=class;
run;
答案 1 :(得分:1)
单个新列的左连接等效项是SAS自定义格式。从小表创建两个新的自定义格式,而不是重建大表,创建一个重复id两次的视图,将新格式应用于重复 - 扩展信息的视图范围。
以视图为中心的解决方案使large_table扩展能够在更新小表概念格式时响应小表中的任何更改。
例如
data fmt1 / view=fmt1;
fmtname = 'small_1_concept';
set small_table1(rename=(id=start newinfo1=label));
run;
data fmt2 / view=fmt2;
fmtname = 'small_2_concept';
set small_table2(rename=(id=start newinfo2=label));
run;
proc format cntlin=fmt1;
proc format cntlin=fmt2;
proc sql;
create view large_table_extended_v as
select
large_table.*
, id as id1 format=small_1_concept.
, id as id2 format=small_2_concept.
from
large_table
;
quit;