高效设计工作流程,将表合并在一起



我需要创建一个大约有20k行、10k列的表。该表将通过合并几十个源表(如a、B、C、..(来创建,。。,F、 并且列必须相应地排序(首先是A中的列,然后是B中的列等(。表A设置了分母,并在最终表格中列出了所需的所有观察结果。所有表都具有相同的用于联接/合并的唯一键。

每个源表彼此独立。在源表准备好之前,无法知道源表中要合并的列数/列数。有时,源表在合并后需要再次更新。

我一直在做类似于A的左联接B、左联接C、左联接D…的操作,并且我以增量方式保存了每个合并的输出。

在需要将C更新为C*并再次合并的情况下。有没有一种方法可以有效地做到这一点,而不是像合并C*、合并D,。。。对于C*之后的表,再次进行所有操作。

或者有时我已经准备好了A、B、D…F。我按照顺序把它们合并了。那么C就准备好了。我需要将C合并到A、B,并再次对其他表重复合并。有什么方法可以重新思考最终输出的创建,以避免冗余??

此外,在这种情况下,是否应该在所有源表中创建键上的索引?

如果id是唯一的(也就是说,您没有进行1-to-N或N-to-M匹配(,那么只需一次合并所有表。

data want ;
merge a b c d e f ;
by id;
run;

可以将表列表放入宏变量中。

%let table_list=a b c2 d e f;
data want ;
merge &table_list;
by id;
run;

您可以将列表放在元数据表中,并从元数据表生成代码。

proc sql noprint;
select memname
into :table_list separated by ' '
from my_metadata
order by order_num
;
quit;

就只更新其中一个表而言,这里的方法应该按正确的顺序设置变量名,但不必重新读取所有表中的所有数据。

列出要从当前"主"表中删除的列,该表来自宏变量(让我们调用DROPLIST(中的OLD_C。为了确保列按顺序排列,您仍然需要表的列表,但我们不需要实际重读所有列,我们只需要能够打开它们,这样SAS就可以按顺序找到变量名。请注意,此列表需要引用新版本的C,以便查看该版本的C中的变量。

%let table_list=a b new_c d e f ;
%let droplist=c1 c2 c3 c4;
data new ;
* Force new list of variables using NEW list of tables in order ;
if 0 then set &table_list ;
merge old(drop=&droplist) new_c ;
by id;
run;

当我从sql数据库中提取数据时,我就是这样做的。我从不同的表中提取数据,并创建单独的sas数据集,主要是按顺序,这样就可以很容易地通过宏将它们单独合并。然后我根据公共密钥将它们合并。

%macro merging(otds, dsnum, keyvar);
%do i=1 %to &dsnum;
data out&i;
set in&i;
if ^missing(&keyvar);
run;
%end;
%do i=1 %to &dsnum;
proc sort data=out&i nodupkey;
by &keyvar;
run;
%end;
data &otds;
merge
%do i = 1 %to &dsnum;
out&i
%end; 
;
by &keyvar;
if &keyvar ne .;
run;
%mend;
%merge(outds,10,Key_Or_Id);

因此,在上面的代码中,我有10个表,它们与公共键合并在一起。如果这些表中的任何一个稍后更新,那么我们可以使用相同的方法再次合并。。希望这能有所帮助!

@Tom对merge的回答是最初合并源表的最佳方式。

初始情况的问题,一些表C具有列,例如z1-z999,然后随后的C*具有列,如z1-z250zed500-zed1729。不在C*中的原始C列(那些z251-z999(应按组合表的列顺序放在哪里?

如果新数据总是包含所需的历史域,则可以在一定程度上管理与类似但不同结构的新数据合并的已维护历史的情况。数据集选项OBS=0可以与merge中的数据集一起使用,以便强制程序数据向量(PDV(的隐式构造具有期望的列顺序。

例如

data history;
merge
a(obs=0)
b(obs=0)
c(obs=0)
d(obs=0)
e(obs=0)
history a b c d e;
;
by key;
run;

PDV中的变量将以与数据集a-e中的出现顺序相同的方式进行排序。不在a-e中的history中的任何变量将以在正在更新的history中看到的顺序出现在PDV的在最右边。

一旦您了解了如何操作PDV构造,就可以开发构造抽象或规则,并通过宏编程强制生成所需的源代码。

最新更新