You can load the data into a temporary array and sum it from there. It is super fast. See the log below.
284 %let obs=2000000;
285 data t1;
286 do dates=1 to &obs;
287 price+1;
288 output ;
289 end;
290 run;
NOTE: The data set WORK.T1 has 2000000 observations and 2 variables.
NOTE: DATA statement used (Total process time):
real time 0.19 seconds
cpu time 0.18 seconds
291
292 %macro dosum(ph,n);
293 sum(
294 %do i=1 %to &n-1;
295 ph[_n_-&i],
296 %end;
297 ph[_n_-&n]
298 )
299 %mend;
300
301 option mprint;
302
303 data t2;
304 set t1 ;
305 array ph(&obs) _temporary_;
306 ph[_n_]=price;
307
308 if _n_>100 then sump=%dosum(ph,100);
MPRINT(DOSUM): sum( ph[_n_-1], ph[_n_-2], ph[_n_-3], ph[_n_-4], ph[_n_-5], ph[_n_-6],
ph[_n_-7], ph[_n_-8], ph[_n_-9], ph[_n_-10], ph[_n_-11], ph[_n_-12], ph[_n_-13], ph[_n_-14],
ph[_n_-15], ph[_n_-16], ph[_n_-17], ph[_n_-18], ph[_n_-19], ph[_n_-20], ph[_n_-21], ph[_n_-22],
ph[_n_-23], ph[_n_-24], ph[_n_-25], ph[_n_-26], ph[_n_-27], ph[_n_-28], ph[_n_-29], ph[_n_-30],
ph[_n_-31], ph[_n_-32], ph[_n_-33], ph[_n_-34], ph[_n_-35], ph[_n_-36], ph[_n_-37], ph[_n_-38],
ph[_n_-39], ph[_n_-40], ph[_n_-41], ph[_n_-42], ph[_n_-43], ph[_n_-44], ph[_n_-45], ph[_n_-46],
ph[_n_-47], ph[_n_-48], ph[_n_-49], ph[_n_-50], ph[_n_-51], ph[_n_-52], ph[_n_-53], ph[_n_-54],
ph[_n_-55], ph[_n_-56], ph[_n_-57], ph[_n_-58], ph[_n_-59], ph[_n_-60], ph[_n_-61], ph[_n_-62],
ph[_n_-63], ph[_n_-64], ph[_n_-65], ph[_n_-66], ph[_n_-67], ph[_n_-68], ph[_n_-69], ph[_n_-70],
ph[_n_-71], ph[_n_-72], ph[_n_-73], ph[_n_-74], ph[_n_-75], ph[_n_-76], ph[_n_-77], ph[_n_-78],
ph[_n_-79], ph[_n_-80], ph[_n_-81], ph[_n_-82], ph[_n_-83], ph[_n_-84], ph[_n_-85], ph[_n_-86],
ph[_n_-87], ph[_n_-88], ph[_n_-89], ph[_n_-90], ph[_n_-91], ph[_n_-92], ph[_n_-93], ph[_n_-94],
ph[_n_-95], ph[_n_-96], ph[_n_-97], ph[_n_-98], ph[_n_-99], ph[_n_-100] )
309
310 keep dates price sump;
311 run;
NOTE: There were 2000000 observations read from the data set WORK.T1.
NOTE: The data set WORK.T2 has 2000000 observations and 3 variables.
NOTE: DATA statement used (Total process time):
real time 2.49 seconds
cpu time 2.49 seconds