0
votes

Valeur manquante de la colonne basée sur la comparaison de date SQL

Besoin d'aide pour obtenir ce côté logique. J'utilise deux champs dans une table.

DATE                RATE
31DEC2014           0.1600    
31DEC2015           0.1600    
31DEC2016           0.1600    
31DEC2017           0.1600
31DEC2018           0.1700
31DEC2019           0.1770


0 commentaires

4 Réponses :


2
votes

Ceci est plutôt compliqué dans ProC SQL. En tant que SELECT CODE>:

select t.*,
       coalesce(t.rate, tt.rate) as imputed_rate
from t join
     (select t.*
      from t join
           (select min(date) as min_date
            from t t2
            where rate is not null
           ) tt
           on t.date = tt.min_date
     ) td;


0 commentaires

1
votes

Je n'aime pas utiliser proc SQL pour ce xxx


0 commentaires

0
votes

Pour la complétude, voici une approche d'étape de données

data want(drop=r);
   do until (rate);
      set have;
      r = rate;
   end;
   do until (z);
      set have end=z;
      if rate = . then rate=r;
      output;
   end;
run;


0 commentaires

1
votes

Vous pouvez effectuer une sous-requête corrélée pour obtenir le taux d'imputé code> comme numéro code> à partir de la date suivante Date code> avec un rapport code>.

Exemple: p>

Données étendues pour inclure des groupes et plusieurs lacunes. P>

data have;
attrib date informat=date9. format=date9.;
input bankid date rate; datalines;
1 31DEC2014           .    
1 31DEC2015           .    
1 31DEC2016           .    
1 31DEC2017           0.1600
1 31DEC2018           0.1700
1 31DEC2019           0.1770
1 31DEC2020           .
1 31DEC2021           0.1250
2 31DEC2014           0.1990
2 31DEC2015           .    
2 31DEC2016           .    
2 31DEC2017           .
2 31DEC2018           0.1700
2 31DEC2019           0.1770
2 31DEC2020           .
2 31DEC2021           0.1250

;

proc sql;
  create table want as
  select 
    have.*,
    case 
      when not missing(rate) then rate
      else (select rate from have as future
            where 
            future.bankid = outer.bankid 
            and future.rate is not null
            and future.date > outer.date
            having future.date = min(future.date)
            )
    end as imputed_rate
  from
    have as outer
  ;
quit;


0 commentaires