2015-12-08 85 views
0

类似的问题已经在论坛上提出,但我似乎有一个独特的问题与我的。我不确定这是因为我没有唯一的ID还是因为我的KEY是我的实际数据。我希望你们能帮忙。加入/合并两个表格删除新的重复[PROC SAS in SAS]

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

我要保留我的旧表中的所有值和新表只新变量追加到合并表。两个表中存在的任何键都应具有旧表的值。

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; 
+0

之前问及SO –

+0

我正在寻找所以在弄清楚这一点,似乎无法达成有效的解决方案? – Wolfspirit

+1

'SELECT ISNULL(old.Key,new.Key)键,ISNULL(old.Points,new.Points)指出,与老FULL OUTER JOIN新开old.Key = new.Key' – Eric

回答

0

订单数据集

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

与数据集由,只输出第一键组合的他们,如果有匹配

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

我最终只使用了SAS而不是PROC SQL。你的实现比我的更复杂!谢谢。 – Wolfspirit

+0

没问题:)请注意,即使这些代码仅在新表中,此代码也会删除所有重复的键值。组合表将只存储所述密钥的第一次出现。 – RamB

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]

+0

为什么Min(参数)? – Wolfspirit

+0

值得一提的是,我在SAS中使用了Proc SQL函数,它不能识别交叉应用功能 – Wolfspirit

+0

要确保要显示的点是每个键使用的第一个点。那是你想要达到的目标吗? –

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 

凝聚返回如果第一个值不缺少第一个值,否则返回第二个值。

+0

不幸的是,有重复的键,我们希望保留旧版本的值。 – Wolfspirit

+0

或者您是否意味着每个表格中的重复? – Wolfspirit

+0

我的意思是源表中的重复项。只要给定表中的所有关键值都是唯一的,并且点永远不为空/缺少,上述工作就可以实现。 – Ludwig61

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; 
+0

辉煌!这是我学到的新东西:) – Wolfspirit