If you can, using a hash table avoids a Cartesian product and slashes the run time.
For example:
proc sql _method;
create table OUT1 as
select unique START, END, BP
from T1, T2
where START <= BP <= END ;
quit;
data DIF;
do DAYS= 0 to 500;
output;
end;
run;
proc sql _method;
create table OUT2 as
select unique START, END, BP
from T1, T2, DIF D1, DIF D2
where BP = D1.DAYS + START
and END = D2.DAYS + BP ;
quit;
data OUT3;
set T1;
if _N_=1 then do;
dcl hash H(dataset:'T2');
H.definekey('BP');
H.definedata('BP');
H.definedone();
BP=.;
end;
do I= START to END;
RC=H.find(key:I);
if RC=0 then do;
output;
end;
end;
run;
NOTE: Table WORK.OUT1 created, with 1895918 rows and 3 columns.
real time 17.97 seconds user cpu time 15.31 seconds
NOTE: Table WORK.OUT2 created, with 1895918 rows and 3 columns.
real time 5.00 seconds user cpu time 5.37 seconds system cpu time 0.39 seconds
NOTE: The data set WORK.OUT3 has 1895918 observations and 5 variables. real time 0.64 seconds user cpu time 0.57 seconds
... View more