2010-06-28 2 views
1

J'ai deux tables dans une base de données de Teradata qui ressemblent à cecomment mettre à jour les lignes par une plage de dates dans teradata

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 peuplée de paiements. Je souhaite mettre à jour les paiements avec le code de retard basé sur date_updated_last et statement_date. le problème est que statement_date est séquentiel, disons qu'un compte donné a été ouvert en juillet 2009, il y aurait un enregistrement pour chaque mois entre maintenant et maintenant, mais un enregistrement de compte n'est ajouté que lorsque l'information change, donc il peut y avoir, Par exemple, seulement 3 enregistrements dans la table de compte pour le même compte. Say, août 2009, janvier 2010 et mars 2010. donc je voudrais mettre à jour tous les dossiers de paiement entre août 2009 et janvier 2010 avec les données de l'enregistrement août 2009 dans les comptes. quelqu'un peut-il me signaler un moyen facile de le faire?

Thank you :)

C

Répondre

3

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 
+0

ce qui est une dans la déclaration de jeu? –

+0

Désolé, corrigé cela. J'ai commencé avec juste A comme l'alias de la table, puis l'ai changé sans le changer dans la partie SET. –

+0

cela semble fonctionner. thx tom :) –

Questions connexes