在论坛上提出了类似的问题,但我似乎与我有一个独特的问题。我不确定这是因为我没有唯一的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
我觉得我想要实现的是与此相当的维恩图:
......但无论出于何种原因,我都没有通过此代码获得预期的效果:
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 :(得分: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;