comment mettre à jour les lignes par une plage de dates dans teradata
Question
J'ai deux tables dans une base de données de Teradata qui ressemblent à cette
accounts
account_number integer
date_updated_last datetime
delinquency_code varchar(3)
payments
account_number integer
statement_date datetime
delinquency_code varchar(3)
la colonne de code de la délinquance est renseigné dans les comptes, mais n'est pas renseigné dans les paiements. Je voudrais mettre à jour les paiements avec le code de la délinquance basé sur date_updated_last et statement_date. le problème est que statement_date est séquentiel, par exemple un compte donné a été ouvert en juillet 2009, il y aurait un enregistrement pour chaque mois entre alors et maintenant, mais un enregistrement de compte est ajouté lorsque les changements d'information, donc il peut y avoir, pour par exemple, seulement trois enregistrements de la table de compte pour le même compte. Say, août 2009, janvier 2010 et mars 2010. Je ne voudrais donc mettre à jour tous les enregistrements de paiement entre août 2009 et janvier 2010, les données de l'août 2009 Enregistrement dans les comptes. Pointpeut quiconque me un moyen facile de le faire?
merci:)
-C
La solution
Ok, voici un autre essai à la syntaxe Teradata:
UPDATE
Payments
FROM
(
SELECT
A1.account_number,
A1.date_updated_last AS begin_date,
A2.date_updated_last AS end_date,
A1.delinquency_code
FROM
Accounts A1
INNER JOIN Accounts A2 ON
A2.account_number = A1.account_number AND
A2.date_updated_last > A1.date_updated_last
WHERE
NOT EXISTS
(
SELECT *
FROM
Accounts A3
WHERE
A3.account_number = A1.account_number AND
A3.date_updated_last > A1.date_updated_last AND
A3.date_updated_last < A2.date_updated_last
)
) AS SQ (account_number, begin_date, end_date, delinquency_code)
SET
delinquency_code = SQ.delinquency_code
WHERE
account_number = SQ.account_number AND
statement_date >= SQ.begin_date AND
statement_date < SQ.end_date