2017-09-15 2 views
0

En essayant d'utiliser la fonction LAG dans SAS pour répliquer un morceau de code dans une migration vers SAS DI, il ne semble pas y avoir du tout la même fonction dans SAS DI. En utilisant SAS DI 4.21 actuellement, en vue de passer rapidement à 4.9.SAS DI LAG1 alternative?

Donc ma question est, est-il une autre façon de reproduire le code suivant dans SAS DI:

DATA work.dm_chg_bal; 
SET tmp_bal_chg; 
FORMAT dt2 date9.; 
acct_id2 = LAG1(acct_id); 
app_suf2 = LAG1(app_suf); 
dt2 = LAG1(start_dt); 
RUN; 

Cheers,

Répondre

0

Pour cela, je voudrais utiliser un utilisateur de transformation écrite. Il n'y a vraiment aucun problème à le faire tant que vous êtes assez diligent pour effectuer le mappage des variables - conservant ainsi la lignée de données dans les métadonnées. Une explication est disponible pour here.

0

Je ne connais pas bien les transformations DI Studio (je n'utilise généralement que la transformation User Written).

Je me demande s'il y a une transformation que vous pourriez duper en production:

data work.dm_chg_bal; 
    set tmp_bal_chg; 
    output; 
    set tmp_bal_chg(rename=(acct_id=acct_id2 app_suf=app_suf2 start_dt=dt2)); 
run; 

ou

data work.dm_chg_bal; 
    if _n_ > 1 then set tmp_bal_chg(rename=(acct_id=acct_id2 app_suf=app_suf2 start_dt=dt2)); 
    set tmp_bal_chg; 
run; 

Sinon, je suis sûr qu'il ya des transformations de données qui vous permettront de faire deux copies de l'ensemble de données, une avec ID=_n_ et l'autre avec ID=_n_+1, puis fusionner par ID. C'est-à-dire, générer:

data main; 
    set tmp_bal_chg; 
    ID = _n_ ; 
run; 

data lag; 
    set tmp_bal_chg (rename=(acct_id=acct_id2 app_suf=app_suf2 start_dt=dt2)); 
    ID = _n_ + 1; 
run; 

data work.dm_chg_bal; 
    merge main (in=a) 
     lag (keep=id acct_id2 app_suf2 dt2 in=b) 
    ; 
    by id; 
    if a; 
run;