我有两个数据集DS1
和DS2
。 DS1
是100,000rows x 40cols,DS2
是20,000rows x 20cols。如果某些字段与COL1
匹配,我实际上需要从DS1
提取DS2
。
由于我对SAS非常新,我试图坚持SQL逻辑。
基本上我做了(拍摄版)
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
OR DS1.COL3=DS2.COL3
OR DS1.COL4=DS2.COL2
...
一个小时左右后,它仍然在运行,但是我收到了来自SAS的电子邮件,我正在使用700g左右。是否有更好,更快的SAS方式进行此操作?
答案 0 :(得分:3)
我会使用3个单独的查询并使用UNION
proc sql;
...
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
on DS1.COL2=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
On DS1.COL3=DS2.COL3
UNION
SELECT DS1.col1
FROM DS1 INNER JOIN DS2
ON DS1.COL4=DS2.COL2
...
答案 1 :(得分:3)
您加入的列中可能包含空值或空值。您的查询可能会将所有null / blank列匹配在一起,从而产生非常大的结果集。
我建议添加其他条款以排除空结果。
此外 - 如果两个表中都存在相同的行,那么您还应该阻止该行加入自身。
其中任何一个都可以有效地导致笛卡尔产品加入(或接近笛卡尔产品加入的东西)。
编辑:顺便说一句 - 调试此类问题的一种好方法是将两个数据集限制为一定数量的行 - 比如说每行100个 - 然后运行它并检查输出确保它是预期的。您可以使用SQL选项inobs=
,outobs=
和loops=
执行此操作。 Here's a link to the documentation
答案 2 :(得分:0)
首先使用proc排序对要尝试合并的数据集进行排序。然后根据id合并数据集。
以下是如何做到这一点。 我假设你匹配字段为ID
proc sort data=DS1;
by ID;
proc sort data=DS2;
by ID;
data out;
merge DS1 DS2;
by ID;
run;
您可以对Ds3和DS4使用proc排序,然后在合并语句中包含它们,如果您还需要加入它们。