我有多个具有相同变量的相同格式的主表。我现在想要加入另一个变量,但由于我的计算机存储空间有限,我无法组合主表。有没有办法可以将变量连接到一个PROC SQL中的多个主表上?也许在宏的帮助下?
对于一个连接,LEFT JOIN代码看起来像这样,但我正在寻找一种替代方法,而不是复制和粘贴这5次:
PROC SQL;
CREATE TABLE New AS
SELECT a.*, b.Value
FROM Old a LEFT JOIN Additional b
ON a.ID = b.ID;
QUIT;
答案 0 :(得分:1)
您不能在一个create table
语句中执行此操作,因为它一次只创建一个表。但你可以做一些事情,这取决于你的实际限制因素(你提到一些)。
如果你只是想避免写五次相同的代码,但是不关心它是如何执行的,那么只需在宏中编写代码,就像你引用一样。
%macro update_table(old=, new=);
PROC SQL;
CREATE TABLE &new. AS
SELECT a.*, b.Value
FROM &old. a LEFT JOIN Additional b
ON a.ID = b.ID;
QUIT;
%mend update_table;
%update_table(old=old1, new=new1)
%update_table(old=old2, new=new2)
%update_table(old=old3, new=new3)
当然,如果五个表的名称都在某个模式中,您可以根据该模式进一步自动化,但是您没有提供足够的信息来解决这个问题。
另一方面,如果您需要在处理方面更有效地执行此操作而不是运行SQL查询五次,则可以通过多种方式完成此操作,具体取决于您的附加细节表和您的具体限制。在我看来,你在这里有一个很好的用例进行格式查找,例如;例如,见Jenine Eason's paper, Proc Format, a Speedy Alternative to Sort/Merge。如果你只是在合并ID,这很容易。
data for_format;
set additional;
start = ID;
label = value;
fmtname='AdditionalF'; *or '$AdditionalF' if ID is character-valued;
output;
if _n_=1 then do; *creating an "other" option so it returns missing if not found;
hlo='o';
label = ' ';
output;
end;
run;
然后您只需要五个数据步骤并添加PUT
语句,或者您甚至可以使用该格式格式化ID变量,并且每当您拥有该值时做了大多数PROC(如果这类似于数据中你并不真正需要的分类器)。
答案 1 :(得分:1)
您可以使用哈希表一次性通过数据步骤中的数据来查找值。
data new1 new2 new3;
set old1(in=a) old2(in=b) old3(in=c);
format value best.;
if _n_=1 then do;
%create_hash(lk,id,value,"Additional");
end;
value = .;
rc = lk.find();
drop rc;
if a then
output new1;
else if b then
output new2;
else if c then
output new3;
run;
%create_hash()
宏可用here。
您也可以使用具有相同数据步骤语法的Joe格式。