See here an application of temporary arrays to your data:
data product;
infile datalines delimiter=',';
input prod_id product_name $ prod_var1;
datalines;
1, aaa, 100
2, bbb, 250
3, ccc, 200
4, ddd, 100
5, ddd, 250
;
data customer;
infile datalines delimiter=',';
input cust_id cust_var1 cust_var2;
datalines;
1, 100, 2
2, 200, 5
3, 300, 5
;
proc sort data=product;
by descending prod_var1;
run;
proc sql noprint;
select nobs into :nobs
from dictionary.tables
where libname = "WORK" and memname = "PRODUCT";
quit;
data want;
set customer;
if _n_ = 1
then do;
array p_id {&nobs.} _temporary_;
array p_name {&nobs.} $8 _temporary_;
array p_var1 {&nobs.} _temporary_;
do i = 1 to &nobs.;
set product;
p_id{i} = prod_id;
p_name{i} = product_name;
p_var1{i} = prod_var1;
end;
end;
do i = 1 to dim(p_id);
if p_id{i} ne cust_var2 and cust_var1 le p_var1{i}
then do;
prod_id = p_id{i};
product_name = p_name{i};
prod_var1 = p_var1{i};
output;
end;
if cust_var1 gt p_var1{i} then leave;
end;
drop i;
run;
proc sort data=want;
by cust_id prod_id;
run;
proc print data=want noobs;
run;
Result:
cust_id cust_var1 cust_var2 prod_id product_name prod_var1
1 100 2 1 aaa 100
1 100 2 3 ccc 200
1 100 2 4 ddd 100
1 100 2 5 ddd 250
2 200 5 2 bbb 250
2 200 5 3 ccc 200
... View more