连接/合并两个表以删除新的重复项[SAS中的PROC SQL]

连接/合并两个表以删除新的重复项[SAS中的PROC SQL],sql,join,merge,sas,proc-sql,Sql,Join,Merge,Sas,Proc Sql,论坛上也有人问过类似的问题,但我似乎有一个独特的问题。我不确定这是因为我没有唯一的ID,还是因为我的键是我的实际数据。我希望你们能帮忙 我正在尝试合并两个具有相同列结构的表(旧表和新表) 我希望保留旧表中的所有值,并仅将新表中的新变量追加到组合表中。两个表中存在的任何键都应采用旧表的值 OLD TABLE Key | Points AAA | 1 BBB | 2 CCC | 3 NEW TABLE Key | Points AAA | 2 BBB | 5 CCC | 8 DDD | 6 Co

论坛上也有人问过类似的问题,但我似乎有一个独特的问题。我不确定这是因为我没有唯一的ID,还是因为我的
键是我的实际数据。我希望你们能帮忙

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

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

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;
这可能对你有帮助


选择B.[Key]、MIN(当A.[Key]=B.[Key]时,选择A.点,否则选择B.点结束)作为“点”
从旧表A
交叉表B

按B[键]

分组,只要两个表中的键没有重复值:

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返回第一个值,否则返回第二个值。

如果两个表中都没有重复的键,则数据步骤中的一个简单的
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;
对数据集进行排序

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;

我在搜索时发现了这个问题,似乎无法找到有效的解决方案?
选择isnull(old.Key,new.Key)Key,isnull(old.Points,new.Points)旧的完全外部连接点旧的上新的。Key=New。Key
看起来SAS有严重的限制-它也不将ISNULL识别为函数:/值得一提的是,我在SAS中使用Proc SQL函数,它不识别交叉应用函数,以确保要显示的点是用于每把钥匙。这就是您想要实现的吗?您正在使用的SQL版本是什么?如果交叉应用不起作用,您可以在相同的输出中尝试此操作,选择B.[Key],MIN(当A.[Key]=B.[Key]时,则选择A.点,否则B.点结束)作为旧表A中的“点”,新表B按B.[Key]分组。我现在正在测试您的代码。我仍然在想,你的MIN()函数是否只是从任意一个键中选取两个值中较小的一个?分配的较新点可能不会更大。不幸的是,存在重复的键,我们希望保留旧版本中的值。或者您是指每个表本身中的重复项?我是指源表中的重复项。只要给定表中的所有键值都是唯一的,并且点从不为null/缺失,上述方法就可以工作。我最终使用的是SAS而不是PROC SQL。你的实现比我的要简单得多!谢谢。没问题:)请注意,此代码将删除所有重复的键值,即使它们仅在新表中。组合表将仅存储所述密钥的第一次出现。