Sorry. My code still don't work for this scenario:
8801669 8801669 97082679 1-Nov-15
8801669 6368875 106930088 1-Nov-15
8801669 8801669 107207912 1-Nov-15
TRY THIS CODE:
data one;
infile datalines expandtabs truncover;
input CURR_RK ORIG_RK CUST_SK VALID_DTTM: anydtdte10. ;
format VALID_DTTM date9.;
datalines;
41 2673 2342321 1-Sep-12
41 41 12559928 1-Jan-13
41 4615581 14452649 1-Feb-13
41 4615581 67316104 1-Aug-14
41 41 72971041 1-Oct-14
41 4615581 74341618 1-Nov-14
41 8828883 63829111 1-Jul-15
9217 9217 21128775 1-Jan-13
9217 10124544 15142897 1-Jan-13
9217 9217 30874351 1-Mar-13
9217 9217 71276102 1-Sep-14
9217 10124544 74885982 1-Nov-14
346372 346372 6478392 1-Sep-14
7801669 6368875 2591876 1-Dec-12
7801669 7801669 3829995 1-Jan-13
7801669 7801669 97082679 1-Aug-15
7801669 6368875 106930088 1-Nov-15
7801669 7801669 107207912 1-Nov-15
8801669 8801669 97082679 1-Nov-15
8801669 6368875 106930088 1-Nov-15
8801669 8801669 107207912 1-Nov-15
;
run;
data have;
do total=1 by 1 until(last.curr_rk);
set one;
by curr_rk;
end;
do n=1 by 1 until(last.curr_rk);
set one;
by curr_rk;
output;
end;
run;
data want;
if _n_=1 then do;
if 0 then set have(rename=(CUST_SK=new_sk VALID_DTTM=new_dt));
declare hash h2();
h2.definekey('CURR_RK','n');
h2.definedata('new_sk','new_dt');
h2.definedone();
end;
do until(last.curr_rk);
set have;
by curr_rk;
if CURR_RK=ORIG_RK then do;
new_sk=CUST_SK; new_dt=VALID_DTTM;h2.add();
end;
end;
do until(last.curr_rk);
set have;
by curr_rk;
if CURR_RK=ORIG_RK then do;want_sk=CUST_SK;want_dt=VALID_DTTM; end;
else do;
do k=n-1 to 1 by -1;
call missing(new_sk,new_dt);
rc=h2.find(key:CURR_RK,key:k);
if rc=0 then do;
want_sk=new_sk;
want_dt=new_dt;
leave;
end;
end;
do k=n+1 to total;
call missing(new_sk,new_dt);
rc=h2.find(key:CURR_RK,key:k);
if rc=0 then do;
if (new_dt=VALID_DTTM and want_dt ne new_dt) /*<------*/
or first.curr_rk then do;
want_sk=new_sk;
want_dt=new_dt;
end;
leave;
end;
end;
end;
output;
end;
h2.clear();
format want_dt date9.;
drop rc new_sk new_dt n k total;
run;
... View more