SAS data step doesn't allow you to read ahead to the next record, not within a single pass of the data anyway. The LAG function is retaining the value from the previously read record so that's why your initial attempt to put the date difference calculation was "offset" by one line (for your tastes anyway). Fortunately, you should be able to accomplish this type of staged calculation using a hash table approach in V9 of SAS. Try the following..... data test ; input id name $2. date anydtdte23. ; format date date9. ; counter=_n_ ; /* create an observation counter from automatic PDV variable. */ mykey=counter-1 ; /* create a trick field to apply as key to previous record in subsequent hash table step. */ cards ; ...... your data here ..... ; run; data test2(drop=rc mykey tempdt counter ) ; if 0 then set test(keep=mykey date rename=(date=tempdt) ) ; /* rename date field to use it in calculation step later */ if _n_=1 then do; /* define the hash table definition once */ declare hash aa(dataset:'work.test(keep=mykey date where=(mykey>0) rename=(date=tempdt) )' ) ; /* throw out the first obs from original file */ rc=aa.definekey('mykey') ; /* key field on which to identify matching records */ rc=aa.definedata('tempdt') ; /* the data field(s) to introduce into the PDV when a match is found on the key value */ rc=aa.definedone() ; /* end the definition of the hash object */ end; set test(drop=mykey) ; /* read in all the original data but throw out the mykey field */ call missing(tempdt) ; /* initialize the temporary date field to missing for each pass of the main data, otherwise values would persist */ rc=aa.find( key: counter ) ; /* look in the hash object for a matching record, based on the value of the counter field */ diff=intck('day' , tempdt , date ) ; format tempdt date9. ; run; proc print ; run ;
... View more