2

私は、各従業員がマネージャーの地位に結び付けられている以下のデータセットを持っています。ここで、従業員のマネージャーの従業員 ID をマネージャー ポジションを使用して見つける必要があります。直属のマネージャーのポジションにアクティブな人がいない場合は、マネージャーのマネージャーのポジションを見つけて、アクティブな従業員がそのポジションに関連付けられていることを確認する必要があります。これは、ACTIVE マネージャーが見つかるまで続ける必要があります。

ID -> Employee ID    
PSTN -> Employee Position code    
MPSTN-> Manager Position code    
STAT -> Employee Status (T - Term A - Active)    

入力データセット:

data input;  
input id pstn mpstn stat$;  
datalines;  
1 10 30 A  
2 20 30 T  
3 30 40 T  
6 30 40 T  
4 40 50 A  
7 40 50 T
5 50 50 A
;
run;

期待される出力データセット:

ID MGR_ID
1  4
2  4
3  4
6  4
4  5
7  5
5  5

POINT関数で問題のRECURSIVEの性質を試しました。

次のレベルのアクティブマネージャーを検索する再帰部分を除いて、正常に機能しています。

data output ;
  set input;
  flag = 1;
  do I = 1 to last while (flag=1);
    set input(rename=(pstn=pstn1 stat=stat1 mpstn=mpstn1 id=id1)) nobs=last 
                                                                  point=I;
    if mpstn = pstn1 and stat1 = 'A' then
     do;
        MGRID = id1;
        I=1;
        flag=0;
     end;
    else flag=1;
  end;
run; 

これで私を助けてください。

4

1 に答える 1

2

ハッシュ マップを使用して入力データセットをループし、値を検索できます。ルックアップを再帰的に呼び出す代わりに、ルックアップをdo while()ループに入れることをお勧めします。

data input;  

input id pstn mpstn stat$;  
format stat $1.;
datalines;  
1 10 30 A  
2 20 30 T  
3 30 40 T  
6 30 40 T  
4 40 50 A  
7 40 50 T
5 50 50 A
;
run;

data out(keep=id mgr_id);
set input;
format pstn1 id1 mpstn1 best.
       stat1 $1.;
if _n_ = 1 then do;
    declare hash mgr(dataset:"input(rename=(pstn=pstn1 stat=stat1 mpstn=mpstn1 id=MGR_ID))");
    rc = mgr.definekey("pstn1");
    rc = mgr.definedata("MGR_ID");
    rc = mgr.definedata("mpstn1");
    rc = mgr.definedata("stat1");
    rc = mgr.definedone();
end;

found = 0;
do while(^found);
    pstn1 = mpstn;
    rc = mgr.find();
    if stat1 = "A" then do;
        /*MGR Found*/
        found = 1;
    end;
    else if rc then do;
        /*RC^=0 when lookup fails*/
        MGR_ID = .;
        found = 1;
    end;
    else do;
        mpstn = mpstn1;
    end;
end;
run; 
于 2013-09-03T23:37:52.943 に答える