SAS合并和完全外部联接之间的区别

时间:2015-08-21 14:26:26

标签: merge hive sas outer-join hiveql

表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合并的输出相匹配的任何建议?

1 个答案:

答案 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
   ;

我目前无法测试此代码,因此请务必对其进行测试。祝你好运。