I'm not sure which parts of this you would feel comfortable doing ... are you able to transpose the data to get the contacted dates onto a single observation? Then merge that back onto the original data BY ANI? It would be helpful to add a sequential call number at that point: data want; merge have transposed_dates; by ANI; if first.ANI then call_number=1; else call_number + 1; *** add computations if desired; run; Then the added computations could utilize all the information ahead of time, or you could wait to perform the computations until you absolutely need the information. For example, the "add computations" section could include: array cdates {*} contact_date_:; if call_number < dim(cdates) then DUNC1 = cdates{call_number + 1} - cdates{call_number}; if call_number > 3 then DSLC3 = cdates{call_number} - cdates{call_number - 3}; Like Reeza said, you would need to familiarize yourself with arrays to perform these computations. And the reference to contact_date_: means that the variables in the array would be all variable names that begin with the characters "contact_date_".
... View more