Таблица 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?
Если это полезно, то, как SAS делает это, если вы ограничиваете левую таблицу и правую таблицу только определенным набором строк, все из которых имеют общее значение ключа (скажем, ваши две 3-4 строки на каждой таблице), он затем идет по одной строке за раз вниз по каждой таблице - так что A.r1 = B.r1 и A.r2 = B.r2 - а затем, если одна таблица заканчивается из строк, она сохраняет последнюю строку, поэтому эффективно A.r3 = B.r2 A.r4 = B.r2 и т. Д., Если A имеет более 3-4 строк. – Joe
Также есть ли у HiveQL функция Coalesce? Кажется проще, чем во всех случаях, когда дело. – Joe
Это помогает мне понять, что происходит дальше. Кроме того, хорошая идея об объединении. @Joe – Danzo