data jul11.merge11;
input month sales ;
datalines ;
1 3123
1 1234
2 7482
2 8912
3 1284
;
run;
data jul11.merge22;
input month goal ;
datalines;
1 4444
1 5555
1 8989
2 9099
2 8888
3 8989
;
run;
data jul11.merge1;
merge jul11.merge11 jul11.merge22 ;
by month;
difference =goal - sales ;
run;
proc print data=jul11.merge1 noobs;
run;
输出:
月销售目标差异
1 3123 4444 1321
1 1234 5555 4321
1 1234 8989 7755
2 7482 9099 1617
2 8912 8888 -24
3 1284 8989 7705
为什么它与表1中的所有观察结果不符合表2中的常见月份?
pdv保留观察数据,以便在重新初始化之前寻找是否有任何更多的观察结果留给该组,在这种情况下,它应该已经完成笛卡尔积。
为一对多合并提供完美的笛卡尔积,但不是为了多对多。
答案 0 :(得分:3)
这是因为SAS处理数据步骤的方式。合并永远不是真正的笛卡尔积(即,所有记录都会被搜索并与所有其他记录匹配,就像SQL逗号连接一样); SAS做了什么(在两个数据集的情况下)是跟随一个数据集(左边的那个)并前进到下一个特定的按组值;然后它会查看正确的数据集,然后继续前进,直到达到组值。如果中间有其他记录,则单独处理这些记录。如果没有,但有匹配,则匹配这些记录。
然后它在左侧查看该组中是否还有其他内容,如果有,则前进到下一个。它在右侧也是如此。如果只有其中一个匹配,那么它只会带来这些值;因此,如果左边有1个元素,右边有5个元素,它会做1x5或5行。但是,如果左边有2个,右边有3个,则不会做2x3 = 6;它执行1:1,2:2和2:3,因为它按顺序推进了记录指针。
以下示例是查看其工作原理的好方法。如果你真的想要看到它的实际效果,请引入数据步调试器并以交互方式使用它。
data test1;
input x row1;
datalines;
1 1
1 2
1 3
1 4
2 1
2 2
2 3
3 1
;;;;
run;
data test2;
input x row2;
datalines;
1 1
1 2
1 3
2 1
3 1
3 2
3 3
;;;;
run;
data test_merge;
merge test1 test2;
by x;
put x= row1= row2=;
run;
如果您确实想在SAS datastep中进行笛卡尔连接,则必须执行嵌套的SET语句。
data want;
set test1;
do _n_ = 1 to nobs_2;
set test2 point=_n_ nobs=nobs_2;
output;
end;
run;
那是真正的笛卡儿,你可以通过群体平等来测试;但那太乱了,真的。您还可以使用哈希表查找,这对BY组更有效。讨论了here。
答案 1 :(得分:0)
SAS在datastep中不能很好地处理多对多合并。如果要进行多对多合并,则需要使用PROC SQL。