表t1:
person | visit | code_num1 | code_desc1
1 1 100 OTD
1 2 101 SED
2 3 102 CHM
3 4 103 OTD
3 4 103 OTD
4 5 101 SED
表t2:
person | visit | code_num2 | code_desc2
1 1 104 DME
1 6 104 DME
3 4 103 OTD
3 4 103 OTD
3 7 103 OTD
4 5 104 DME
我有以下SAS代码,按人员合并两个表t1和t2并访问:
DATA t3;
MERGE t1 t2;
BY person visit;
RUN;
产生以下输出:
person | visit | code_num1 | code_desc1 |code_num2 | code_desc2
1 1 100 OTD 104 DME
1 2 101 SED
1 6 104 DME
2 3 102 CHM
3 4 103 OTD 103 OTD
3 4 103 OTD 103 OTD
3 7 103 OTD
4 5 101 SED 104 DME
我想在配置单元查询中复制它,并尝试使用完全外连接:
create table t3 as
select case when a.person is null then b.person else a.person end as person,
case when a.visit is null then b.visit else a.visit end as visit,
a.code_num1, a.code_desc1, b.code_num2, b.code_desc2
from t1 a
full outer join t2 b
on a.person=b.person and a.visit=b.visit
产生表格:
person | visit | code_num1 | code_desc1 |code_num2 | code_desc2
1 1 100 OTD 104 DME
1 2 101 SED null null
1 6 null null 104 DME
2 3 102 CHM null null
3 4 103 OTD 103 OTD
3 4 103 OTD 103 OTD
3 4 103 OTD 103 OTD
3 4 103 OTD 103 OTD
3 7 null null 103 OTD
4 5 101 SED 104 DME
这几乎与SAS相同,但我们有2个额外的行(person = 3,visit = 4)。我假设这是因为配置单元将一个表中的每一行与另一个表中的两行匹配,在t3中生成4行,而SAS则不然。关于如何使我的查询与SAS合并的输出相匹配的任何建议?
答案 0 :(得分:0)
如果合并两个数据集并且它们具有相同名称的变量(除了by变量),则第二个数据集中的变量将覆盖第一个数据集中具有相同名称的任何变量。因此,您的sas代码会创建一个重叠的数据集。完全外部联接不会这样做。
在我看来,如果您首先重复删除右侧表,然后执行完全外部联接,您应该在蜂巢中获得等效表。当Joe发表声明时,我不认为需要这个案例。只需加入关键值:
create table t3 as
select coalesce(a.person, b.person) as person
, coalesce(a.visit, b.visit) as visit
, a.code_num1
, a.code_desc1
, b.code_num2
, b.code_desc2
from
(select * from t1) a
full outer join
(select person, visit, code_num2, code_desc2
group by person, visit, code_num2, code_desc2 from t2) b
on a.person=b.person and a.visit=b.visit
;
我目前无法测试此代码,因此请务必对其进行测试。祝你好运。