Это должно быть просто, но я не могу этого понять. Мне нужно сделать выбор, чтобы получить более новые значения даты для некоторых учетных записей.
Я начинаю здесь, Т1:
+----------+---------+
| 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.
Спасибо!
Я думаю, ты хочешь:
select t2.*
from t2
union all
select t1.*
from t1
where not exists (select 1 from t2 where t2.account = t1.account);
Это выбирает первым из t2
. Потом забирает оставшиеся аккаунты с t1
.
Вот еще одно решение с левым внешним соединением:
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
Просто дополнение к ранее хорошим ответам ... попробуйте также использовать его с coalesce
и дайте мне знать, улучшит ли он производительность.
select t1.Account, coalesce(t2.Date, t1.Date)
from t1
left outer join t2
on t2.Account = t1.Account
Я согласен, Case по-прежнему полезен, если у вас есть сложные условия для нескольких столбцов.
Это не улучшит производительность по сравнению с CASE, но его синтаксис короче и чище.