If the UPDATE statement offered by @novinosrin seems slightly opaque, there is another way to avoid using RETAIN as per @r_behata. You can utilize the fact that any variable read by a SET is automatically retained until that variable is explicitly overwritten. So below the STAFF variable is only read in when period='Start', and therefore will be retained until the next period='Start' by executing the SET statement conditionally (i.e. "IF period='Start' then set ...").
data have;
input Period $ Staff $ ID $;
infile cards dsd;
cards;
Start,John,1234
End,,1234
End,,1234
End,,1234
Start,Dira,9876
End,,9876
;
run;
data want;
set have (drop=staff);
if period='Start' then set have (keep=staff) point=_n_;
run;
But remember one thing - while variable STAFF is the only variable read in by the conditional SET statement, it is also dropped from the unconditional SET.
Now if you want to propagate ALL variables forward to replace missing values across an ID, use @novinosrin's UPDATE suggestion. But if you only wish to do it for a particular subset of variables, try the above.
... View more