加入/合并两个表删除新的重复项[SAS中的PROC SQL]

时间:2015-12-08 05:44:58

标签: sql join merge sas proc-sql

在论坛上提出了类似的问题,但我似乎与我有一个独特的问题。我不确定这是因为我没有唯一的ID,或者我的KEY是我的实际数据。我希望你们能帮忙。

我正在尝试合并两个具有相同列结构的表(旧表和新表)。

我希望在Old表中保留所有值,并将新表中的新变量追加到组合表中。两个表中存在的任何键都应该采用Old表的值。

OLD TABLE
Key | Points
AAA | 1
BBB | 2
CCC | 3

NEW TABLE
Key | Points
AAA | 2
BBB | 5
CCC | 8
DDD | 6

Combined TABLE
Key | Points
AAA | 1
BBB | 2
CCC | 3
DDD | 6

我觉得我想要实现的是与此相当的维恩图:

Venn diagram

......但无论出于何种原因,我都没有通过此代码获得预期的效果:

CREATE TABLE Combined
SELECT * FROM Old as A
FULL OUTER JOIN New as B ON A.Key=B.Key
WHERE A.Key IS NULL OR B.Key IS NULL;

4 个答案:

答案 0 :(得分:0)

这可能会对你有帮助。

SELECT B.[Key], MIN(CASE WHEN A.[Key] = B.[Key] THEN A.Points ELSE B.Points END) AS 'Points' FROM OldTable A CROSS APPLY NewTable B GROUP BY B.[Key]

答案 1 :(得分:0)

只要表中的键没有重复值:

SELECT COALESCE(a.key,b.key) AS key, COALESCE(a.points,b.points) AS points
  FROM old a FULL OUTER JOIN new b ON a.key EQ b.key

如果没有丢失第一个值,Coalesce将返回第一个值,否则返回第二个值。

答案 2 :(得分:0)

如果您在两个表中都没有重复的键,那么数据步骤中的简单update语句就可以完成这项工作。您只需确保NEW_TABLE是列表中的第一个,因此OLD_TABLE中的值将替换密钥匹配的值。一个表独有的任何键都将自动输出。

您的数据需要按密钥排序,如您的示例所示。

data OLD_TABLE;
input Key $ Points;
datalines;
AAA 1
BBB 2
CCC 3
;
run;

data NEW_TABLE;
input Key $ Points;
datalines;
AAA 2
BBB 5
CCC 8
DDD 6
;
run;

data want;
update new_table old_table;
by key;
run;

答案 3 :(得分:0)

订购数据集

proc sort data=old; 
    by key; 
run;
proc sort data=new; 
    by key; 
run;

将它们与带有by的数据集合并,如果匹配则仅输出第一个键

data combined;
set 
    old
    new;
by key;
if first.key then output;
run;