在 SAS 中加入两个数据集的替代方法

Alternative way of joining two datasets in SAS

我有两个数据集 DS1DS2DS1 是 100,000 行 x 40 列,DS2 是 20,000 行 x 20 列。如果某些字段匹配 DS2,我实际上需要从 DS1 中提取 COL1。 由于我对 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 的电子邮件,说我正在使用 700gb 左右。是否有更好更快的 SAS 方式来执行此操作?

我会使用 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
...

您加入的列中可能有空值或空值。您的查询可能会将所有 null/blank 列匹配在一起,从而产生非常大的结果集。

我建议添加额外的子句以排除空结果。

此外 - 如果同一行恰好存在于两个表中,那么您还应该防止该行连接到自身。

其中任何一个都可以有效地导致笛卡尔积连接(或接近笛卡尔积连接的东西)。

编辑: 顺便说一句 - 调试此类问题的一个好方法是将两个数据集限制在一定数量的行 - 比如每个 100 - 然后 运行 它并检查输出以确保它是预期的。您可以使用 SQL 选项 inobs=outobs=loops= 来执行此操作。 Here's a link to the documentation.

首先使用过程排序对您尝试合并的数据集进行排序。然后根据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 排序,然后如果您还需要加入它们,则将它们包含在合并语句中。