Merge SAS合并和完全外部联接之间的差异
表t1:Merge SAS合并和完全外部联接之间的差异,merge,hive,sas,outer-join,hiveql,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
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相同,但是我们有两行额外的内容(person=3,visit=4)。我假设这是因为hive将一个表中的每一行与另一个表中的两行进行匹配,从而在t3中生成4行,而SAS没有。关于如何使查询与SAS合并的输出匹配的任何建议?如果合并两个数据集,并且它们具有相同名称的变量(除了by变量),则来自第二个数据集的变量将在第一个数据集中写入具有相同名称的任何变量。因此,sas代码将创建一个覆盖的数据集。完全外部联接不能做到这一点 在我看来,如果您首先重复删除右侧表,然后执行完整的外部联接,那么您应该在配置单元中获得等效的表。正如乔所指出的那样,我也不认为有必要在发表声明的情况下这样做。只需在键值上进行连接:
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
;
我目前无法测试此代码,因此请务必测试它。祝你好运。如果你合并了两个数据集,并且它们有相同名称的变量(除了by变量),那么来自第二个数据集的变量将在第一个数据集中写入任何具有相同名称的变量。因此,sas代码将创建一个覆盖的数据集。完全外部联接不能做到这一点 在我看来,如果您首先重复删除右侧表,然后执行完整的外部联接,那么您应该在配置单元中获得等效的表。正如乔所指出的那样,我也不认为有必要在发表声明的情况下这样做。只需在键值上进行连接:
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
;
我目前无法测试此代码,因此请务必测试它。祝你好运。如果有帮助,SAS的做法是,将左表和右表限制为一组特定的行,这些行都共享一个共同的键值(例如,每个表上有两个3-4行),然后它一次在每个表下移动一行-因此a.r1=B.r1和a.r2=B.r2-如果一个表的行用完,则保留最后一行,因此,如果A有更多的3-4行,那么实际上A.r3=B.r2 A.r4=B.r2等等。另外,HiveQL没有合并函数吗?似乎比做生意更容易。这确实帮助我更好地理解正在发生的事情。还有,合并的好主意@JoeI猜测如果您在每个表上添加一个行号,并过滤到[a.rownum=b.rownum或a.rownum>max(b.rownum)或b.rownum>max(a.rownum)]之类的内容?如果有帮助,SAS的做法是将左表和右表限制为仅共享一个公共键值的特定行集(例如,每个表上有两个3-4行),然后,它一次沿着每个表向下移动一行-因此a.r1=B.r1和a.r2=B.r2-然后,如果一个表的行数不足,则保留最后一行,因此,如果a有更多的3-4行,则a.r3=B.r2 a.r4=B.r2等。此外,HiveQL没有合并功能吗?似乎比做生意更容易。这确实帮助我更好地理解正在发生的事情。还有,合并的好主意@JoeI猜测如果您在每个表上添加一个行号,并过滤到[a.rownum=b.rownum或a.rownum>max(b.rownum)或b.rownum>max(a.rownum)]之类的内容?虽然与SAS表M相比,这确实为我提供了正确的表,但当t2有不在t1中的重复列时,我会看到一个问题。SAS将在最终表格中包括所有这些,但上面只包括一个,不是吗@我同意你上面写的。这是你问的一个好问题,所以我投了更高的票。当我有时间的时候,我会进一步考虑。谢谢,我仍然在寻找一个自己的解决方案。SAS将在最终表格中包括所有这些,但上面只包括一个,不是吗@我同意你上面写的。这是你问的一个好问题,所以我投了更高的票。当我有时间的时候,我会进一步考虑。谢谢,我还在寻找一个解决办法。