2 votes

comment joindre des tables en comparant deux champs, et en tenant compte des performances

Cela devrait être simple mais je n'y arrive pas. J'ai besoin de faire une sélection pour obtenir des valeurs de date plus récentes pour certains comptes.

Je commence ici, T1 :

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

Ensuite, certaines dates sont mises à jour dans T2 :

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

Comment puis-je obtenir cette sortie dans T3, en mettant à jour uniquement ces comptes ?

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

Je peux faire une jointure sur le numéro de compte, mais qu'en est-il de ceux qui n'ont pas changé ? Comment les capturer ?

De plus, T1 a environ 8 millions d'enregistrements, donc les performances seraient un facteur. Extraction à partir de Teradata, chargement dans Hive.

Gracias.

8voto

vikrant rana Points 1073

Juste un ajout aux bonnes réponses précédentes essayez de l'utiliser avec coalesce également et faites-moi savoir si cela améliore les performances.

select t1.Account, coalesce(t2.Date, t1.Date) 
from t1
left outer join t2
  on t2.Account = t1.Account

3voto

Gordon Linoff Points 213350

Je pense que vous voulez :

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

Cela sélectionne d'abord parmi t2 . Ensuite, il prend les comptes restants de t1 .

3voto

Eray Balkanli Points 2936

Voici une autre solution avec une jointure externe gauche :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X