假设我有一张表A:
sq_id val
1 10
1 10
2 11
3 12
和表B:
sq_id tor_id
1 999
2 456
3 200
假设我合并了这些表:
proc sort data = A; by sq_id; run;
proc sort data = B; by sq_id; run;
data mergetable;
merge A(in=a) B(in=b);
by sq_id;
if a =1;
run;
我得到的输出是:
sq_id val tor_id
1 10 999
1 10
2 11
3 12
所有其他行都没有tor_id的任何值。这有什么理由吗?我检查过这些值没有空格或空格。
答案 0 :(得分:2)
正如其他人在评论中指出的那样,你给出的例子并没有给出有问题的结果。但我猜你指的是多对多类型的合并,在这种情况下,是问题(对于大多数实际情况),数据步骤{ {1}}。
merge
我们看到来自A的第一次观察,其中'sq_id = 1与来自B的第一次相应观察相匹配,而来自A的第二次观测与来自B的第二次观测相匹配。
这很少(如果有的话)我们想要发生的事情。作为一般规则,只要匹配变量上存在重复值,data a;
input sq_id val;
datalines;
1 10
1 11
2 12
3 13
;
data b;
input sq_id tor_id;
datalines;
1 999
1 .
2 456
3 200
;
data mergetable;
merge a (in=a)
b (in=b);
by sq_id;
if a = 1;
run;
* Results;
sq_id val tor_id
1 10 999
1 11 .
2 12 456
3 13 200
就是首选,因为它始终会生成所有可能的组合。
proc sql
proc sql
在这种情况下,来自A的proc sql;
create table mergetable2 as
select a.*,
b.tor_id
from a
full join b
on a.sq_id = b.sq_id;
quit;
* Results;
sq_id val tor_id
1 10 999
1 10 .
1 11 999
1 11 .
2 12 456
3 13 200
的所有观察结果都与来自B的所有观察结果相匹配。{/ 1}}。