как объединить таблицы, сравнив два поля, а также учитывая производительность - PullRequest
0 голосов
/ 26 октября 2018

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

Я начинаю здесь, T1:

+----------+---------+
|  date   | account |
+----------+---------+
| 4/1/2018 |       1 |
| 4/1/2018 |       2 |
| 4/1/2018 |       3 |
| 4/1/2018 |       4 |
| 4/1/2018 |       5 |
+----------+---------+

Затем некоторые даты обновляются в T2:

+----------+---------+
|   date   | account |
+----------+---------+
| 7/1/2018 |       1 |
| 7/1/2018 |       2 |
+----------+---------+

Как я могу получить этот вывод в T3, обновляя только эти учетные записи?

+----------+---------+
|   date   | account |
+----------+---------+
| 7/1/2018 |       1 |
| 7/1/2018 |       2 |
| 4/1/2018 |       3 |
| 4/1/2018 |       4 |
| 4/1/2018 |       5 |
+----------+---------+

Я могу сделать соединение по номеру счета, но как насчет тех, которые не изменились? Как их запечатлеть?

Кроме того, T1 имеет около 8 миллионов записей, поэтому производительность будет иметь значение. Извлечение из Teradata, загрузка в Hive.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вот еще одно решение с левым внешним соединением:

select t1.Account, case when t2.Date is null then t1.Date else t2.Date end
from t1
left outer join t2 on t2.Account = t1.Account
0 голосов
/ 27 октября 2018

Просто дополнение к ранее хорошим ответам .. попробуйте использовать его также с coalesce и дайте мне знать, если это улучшит производительность.

select t1.Account, coalesce(t2.Date, t1.Date) 
from t1
left outer join t2
  on t2.Account = t1.Account
0 голосов
/ 26 октября 2018

Я думаю, что вы хотите:

select t2.*
from t2
union all
select t1.*
from t1
where not exists (select 1 from t2 where t2.account = t1.account);

Сначала выбирается из t2. Тогда он берет оставшиеся счета от t1.

...