加入/合并两个表,删除新的重复项 [SAS 中的 PROC SQL]
Join / Merge two tables removing new duplicates [PROC SQL in SAS]
论坛上有人问过类似的问题,但我的问题似乎很独特。我不确定这是因为我没有唯一 ID 还是因为我的 KEY
是我的实际数据。希望大家帮帮忙
我正在尝试合并两个具有相同列结构的 table(旧的和新的)。
我想保留旧 table 中的所有值,并仅将新 Table 中的新变量附加到组合 Table 中。 table 中存在的任何键都应采用旧 table.
的值
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;
这可能对您有所帮助。
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]
只要 table:
中的键没有重复值
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
如果第一个值不缺失,则合并 returns 第一个值,否则 returns 第二个值。
如果您在 table 中没有重复的键,那么数据步骤中的简单 update
语句就可以完成这项工作。您只需要确保 NEW_TABLE
是列表中的第一个,因此 OLD_TABLE
中的值将替换键匹配的值。一个 table 独有的任何键都将自动输出。
您的数据需要按 Key 排序,如您的示例所示。
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;
订购数据集
proc sort data=old;
by key;
run;
proc sort data=new;
by key;
run;
用by组合成一个数据集,如果匹配则只输出第一个key
data combined;
set
old
new;
by key;
if first.key then output;
run;
论坛上有人问过类似的问题,但我的问题似乎很独特。我不确定这是因为我没有唯一 ID 还是因为我的 KEY
是我的实际数据。希望大家帮帮忙
我正在尝试合并两个具有相同列结构的 table(旧的和新的)。
我想保留旧 table 中的所有值,并仅将新 Table 中的新变量附加到组合 Table 中。 table 中存在的任何键都应采用旧 table.
的值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;
这可能对您有所帮助。
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]
只要 table:
中的键没有重复值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
如果第一个值不缺失,则合并 returns 第一个值,否则 returns 第二个值。
如果您在 table 中没有重复的键,那么数据步骤中的简单 update
语句就可以完成这项工作。您只需要确保 NEW_TABLE
是列表中的第一个,因此 OLD_TABLE
中的值将替换键匹配的值。一个 table 独有的任何键都将自动输出。
您的数据需要按 Key 排序,如您的示例所示。
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;
订购数据集
proc sort data=old;
by key;
run;
proc sort data=new;
by key;
run;
用by组合成一个数据集,如果匹配则只输出第一个key
data combined;
set
old
new;
by key;
if first.key then output;
run;