Here is a single pass solution
data have ;
input id A1 A2 A3 B1 B2 B3 C1 C2 D1 D2 ;
datalines;
1 10 9 8 7 6 5 4 3 2 1
2 0 0 10 9 8 7 6 5 4 3
3 0 0 0 0 6 5 4 3 0 0
;
run;
data want(drop = rc i val pos);
if _N_ = 1 then do;
dcl hash h(ordered : 'D', multidata : 'Y');
h.definekey('val');
h.definedata('val', 'pos');
h.definedone();
dcl hiter hi('h');
end;
set have;
array a{*} a1 -- d2;
do i = 1 to dim(a);
val = a[i];
pos = i;
h.add();
a[i] = 0;
end;
do i = 1 by 1 while (hi.next() = 0);
a[pos] = val;
if i = 3 then leave;
end;
rc = hi.last();
rc = hi.next();
rc = h.clear();
run;
... View more