2015-08-21 2 views
1

Таблица t1:Разница между слиянием SAS и полное внешнее соединение

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). Я предполагаю, что это связано с тем, что куст соответствует каждой строке в одной таблице с двумя строками в другой, создавая 4 строки в t3, тогда как SAS этого не делает. Любые предложения о том, как я могу получить свой запрос, чтобы он совпал с результатом слияния SAS?

+0

Если это полезно, то, как SAS делает это, если вы ограничиваете левую таблицу и правую таблицу только определенным набором строк, все из которых имеют общее значение ключа (скажем, ваши две 3-4 строки на каждой таблице), он затем идет по одной строке за раз вниз по каждой таблице - так что A.r1 = B.r1 и A.r2 = B.r2 - а затем, если одна таблица заканчивается из строк, она сохраняет последнюю строку, поэтому эффективно A.r3 = B.r2 A.r4 = B.r2 и т. Д., Если A имеет более 3-4 строк. – Joe

+0

Также есть ли у HiveQL функция Coalesce? Кажется проще, чем во всех случаях, когда дело. – Joe

+0

Это помогает мне понять, что происходит дальше. Кроме того, хорошая идея об объединении. @Joe – Danzo

ответ

0

Если вы объединили два набора данных, и у них есть переменные с одинаковыми именами (помимо переменных), то переменные из второго набора данных будут перекрывать любые переменные с тем же именем в первом наборе данных. Таким образом, ваш код 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 
    ; 

Я не могу проверить этот код в настоящее время, поэтому обязательно его протестируйте. Удачи.

+0

Хотя это дало мне правильную таблицу по сравнению с таблицей SAS, я предвижу проблему, когда t2 имеет повторяющиеся столбцы, которые не находятся в t1. SAS будет включать все из них в финальную таблицу, но в приведенном выше будет только один, нет? @invoketheshell – Danzo

+0

Я согласен с тем, что вы написали выше. Это хороший вопрос, который вы задали, поэтому я его поддержал. Я буду рассматривать это дальше, когда у меня будет время. – invoketheshell

+0

Спасибо, я все еще ищу решение самостоятельно @invoketheshell – Danzo

Смежные вопросы