<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Find location of Moving max per group in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835503#M330313</link>
    <description>&lt;P&gt;Thanks you all for helping.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since we have 3 working codes, I am curious which one is faster. I run 3 code on 2 PC (1 fast and 1 slower) on a sample of 37million rows.&lt;/P&gt;
&lt;P&gt;I run on lookback 3 days and on lookback 15 days.&lt;/P&gt;
&lt;P&gt;ARRAY method is super fast and surprisingly, the it doesn't take much time for lookback 15 than for lookback 3.&lt;/P&gt;
&lt;P&gt;The other 2 methods are comparable in time.&lt;/P&gt;
&lt;P&gt;Any idea why ARRAY is so good?&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;HHC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is the time needed:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="410"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;&lt;STRONG&gt;Look back 3&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="173"&gt;Fast PC&lt;/TD&gt;
&lt;TD width="173"&gt;Slow PC&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Do Loop&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.67 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.88 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.48 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.85 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;HASH&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.33 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.25 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.20 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ARRAY&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.59 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.06 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.84 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Do Loop&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55.51 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:30.10&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55.50 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:30.11&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Look back 15&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;HASH&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:09.37&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47.01 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:09.39&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ARRAY&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.07 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.99 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7.17 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.68 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data want; 
set have;
drop id_1 date1 value1 count i change_id;
count=0;
i+1;
max_value=value;
max_date=date;
do j =i to nobs until (change_id=1);
	set have(rename=(id=id_1 date=date1 value=value1)) point=j nobs=nobs;
	if count=15 then leave;
	else
	if value1&amp;gt;max_value then do;
		max_value=value1;
		max_date=date1;
		end;
	count=count+1;
end;
run;



data want;
if _n_=1 then do;
 declare hash h();
 h.definekey('d');
 h.definedata('d','v');
 h.definedone();
end;
 set have;
 by id;
if first.id then h.clear();
d=date;v=value;h.add();
do d=date-14 to date;
 if h.find()=0 then do;
  if v&amp;gt;max_value then do;max_value=v;max_date=d;end;
 end;
end;
drop d v;
run;



data want ;
  set have ;
  by id;
  array values [15] _temporary_ ;
  array dates  [15] _temporary_ ;
  if first.id then call missing(of values[*] dates[*]);
  values[1+mod(_n_,15)]=value;
  dates[1+mod(_n_,15)]=date;
  max_value=max(of values[*]);
  max_date=dates[whichn(max_value,of values[*])];
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 27 Sep 2022 21:10:06 GMT</pubDate>
    <dc:creator>hhchenfx</dc:creator>
    <dc:date>2022-09-27T21:10:06Z</dc:date>
    <item>
      <title>Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835345#M330257</link>
      <description>&lt;P&gt;Hi Everyone,&lt;/P&gt;
&lt;P&gt;For each date, I lookback 3 days and find the max value using this proc expand below.&lt;/P&gt;
&lt;P&gt;Now I want to find the day that rolling max occurs.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So I use the loop to get it done. However, it is quite slow. I wonder if there is better option.&lt;/P&gt;
&lt;P&gt;Thank you,&lt;/P&gt;
&lt;P&gt;HHC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data have;
input date id value ;
datalines;
1 1 1
2 1 9
3 1 0
4 1 7
5 1 5
1 2 100
2 2 0
3 2 -2
4 2 2
5 2 0
6 2 1
;run;

data have; set have;
drop lid;
lid=lag(id);
if lid^=id then change_id=1;
run;

proc sort data=have; by id descending date;run;

data want; 
set have;
drop id_1 date1 value1 count i change_id;
count=0;
i+1;
max_value=value;
max_date=date;
do j =i to nobs until (change_id=1);
	set have(rename=(id=id_1 date=date1 value=value1)) point=j nobs=nobs;
	if count=3 then leave;
	else
	if value1&amp;gt;max_value then do;
		max_value=value1;
		max_date=date1;
		end;
	count=count+1;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 27 Sep 2022 00:37:58 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835345#M330257</guid>
      <dc:creator>hhchenfx</dc:creator>
      <dc:date>2022-09-27T00:37:58Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835358#M330260</link>
      <description>&lt;P&gt;You state "I look back 3 days and find the max value using this proc expand below." I don't see any call to Proc Expand.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;How many values/dates do you have for each of your Id values? I have an idea but it may have issues with large numbers of records per id.&lt;/P&gt;</description>
      <pubDate>Tue, 27 Sep 2022 04:42:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835358#M330260</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2022-09-27T04:42:41Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835411#M330284</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/*Assuming the dataset has been sorted by id and date*/
data have;
input date id value ;
datalines;
1 1 1
2 1 9
3 1 0
4 1 7
5 1 5
1 2 100
2 2 0
3 2 -2
4 2 2
5 2 0
6 2 1
;

data want;
if _n_=1 then do;
 declare hash h();
 h.definekey('d');
 h.definedata('d','v');
 h.definedone();
end;
 set have;
 by id;
if first.id then h.clear();
d=date;v=value;h.add();
do d=date-2 to date;
 if h.find()=0 then do;
  if v&amp;gt;max_value then do;max_value=v;max_date=d;end;
 end;
end;
drop d v;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 27 Sep 2022 11:45:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835411#M330284</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2022-09-27T11:45:19Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835435#M330293</link>
      <description>&lt;P&gt;A "circular" array is a simple way to implement a rolling window.&amp;nbsp; Use the MOD() function to determine which variable in the array to place the current values.&amp;nbsp; That way the values roll out of the window automatically when they are replaced by the new value.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
  input date id value ;
datalines;
1 1 1
2 1 9
3 1 0
4 1 7
5 1 5
1 2 100
2 2 0
3 2 -2
4 2 2
5 2 0
6 2 1
;


data want ;
  set have ;
  by id;
  array values [3] _temporary_ ;
  array dates  [3] _temporary_ ;
  if first.id then call missing(of values[*] dates[*]);
  values[1+mod(_n_,3)]=value;
  dates[1+mod(_n_,3)]=date;
  max_value=max(of values[*]);
  max_date=dates[whichn(max_value,of values[*])];
run;

proc print;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;PRE&gt;                               max_
Obs    date    id    value    value    max_date

  1      1      1        1       1         1
  2      2      1        9       9         2
  3      3      1        0       9         2
  4      4      1        7       9         2
  5      5      1        5       7         4
  6      1      2      100     100         1
  7      2      2        0     100         1
  8      3      2       -2     100         1
  9      4      2        2       2         4
 10      5      2        0       2         4
 11      6      2        1       2         4

&lt;/PRE&gt;</description>
      <pubDate>Tue, 27 Sep 2022 13:42:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835435#M330293</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-27T13:42:18Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835503#M330313</link>
      <description>&lt;P&gt;Thanks you all for helping.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since we have 3 working codes, I am curious which one is faster. I run 3 code on 2 PC (1 fast and 1 slower) on a sample of 37million rows.&lt;/P&gt;
&lt;P&gt;I run on lookback 3 days and on lookback 15 days.&lt;/P&gt;
&lt;P&gt;ARRAY method is super fast and surprisingly, the it doesn't take much time for lookback 15 than for lookback 3.&lt;/P&gt;
&lt;P&gt;The other 2 methods are comparable in time.&lt;/P&gt;
&lt;P&gt;Any idea why ARRAY is so good?&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;HHC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is the time needed:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="410"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;&lt;STRONG&gt;Look back 3&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="173"&gt;Fast PC&lt;/TD&gt;
&lt;TD width="173"&gt;Slow PC&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Do Loop&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.67 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.88 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.48 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.85 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;HASH&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 18.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.33 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 17.25 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 26.20 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ARRAY&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.59 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.06 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.84 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Do Loop&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55.51 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:30.10&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 55.50 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:30.11&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;Look back 15&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;HASH&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47.34 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:09.37&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 47.01 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1:09.39&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;ARRAY&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9.07 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; real time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.99 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7.17 sec&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cpu time&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10.68 sec&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data want; 
set have;
drop id_1 date1 value1 count i change_id;
count=0;
i+1;
max_value=value;
max_date=date;
do j =i to nobs until (change_id=1);
	set have(rename=(id=id_1 date=date1 value=value1)) point=j nobs=nobs;
	if count=15 then leave;
	else
	if value1&amp;gt;max_value then do;
		max_value=value1;
		max_date=date1;
		end;
	count=count+1;
end;
run;



data want;
if _n_=1 then do;
 declare hash h();
 h.definekey('d');
 h.definedata('d','v');
 h.definedone();
end;
 set have;
 by id;
if first.id then h.clear();
d=date;v=value;h.add();
do d=date-14 to date;
 if h.find()=0 then do;
  if v&amp;gt;max_value then do;max_value=v;max_date=d;end;
 end;
end;
drop d v;
run;



data want ;
  set have ;
  by id;
  array values [15] _temporary_ ;
  array dates  [15] _temporary_ ;
  if first.id then call missing(of values[*] dates[*]);
  values[1+mod(_n_,15)]=value;
  dates[1+mod(_n_,15)]=date;
  max_value=max(of values[*]);
  max_date=dates[whichn(max_value,of values[*])];
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 27 Sep 2022 21:10:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835503#M330313</guid>
      <dc:creator>hhchenfx</dc:creator>
      <dc:date>2022-09-27T21:10:06Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835515#M330316</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/49486"&gt;@hhchenfx&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Thanks you all for helping.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since we have 3 working codes, I am curious which one is faster. I run 3 code on 2 PC (1 fast and 1 slower) on a sample of 37million rows.&lt;/P&gt;
&lt;P&gt;I run on lookback 3 days and on lookback 15 days.&lt;/P&gt;
&lt;P&gt;ARRAY method is super fast and surprisingly, the it doesn't take much time for lookback 15 than for lookback 3.&lt;/P&gt;
&lt;P&gt;The other 2 methods are comparable in time.&lt;/P&gt;
&lt;P&gt;Any idea why ARRAY is so good?&lt;/P&gt;
&lt;P&gt;Thanks,&lt;/P&gt;
&lt;P&gt;HHC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Arrays use internal fixed storage addresses, usually held in memory, and the technology behind them has been around for a &lt;STRONG&gt;very long time&lt;/STRONG&gt;. I can't find a quick reference for the first array use but languages with arrays such as FORTRAN have been around nearly 70 years, FORTRAN developed in 1954 for example. So there has been a lot of opportunity to optimize code.&amp;nbsp; The bit about addresses means that values can be retrieved/written very quickly. The iterated loop, such as Do i= 1 to 10 doesn't require logical comparisons to decide on whether to keep going or not unlike Do While/Until and hence run a bit faster.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'm sure there are other bits as well.&lt;/P&gt;</description>
      <pubDate>Tue, 27 Sep 2022 22:42:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835515#M330316</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2022-09-27T22:42:32Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835581#M330334</link>
      <description>&lt;P&gt;Tom ,&lt;/P&gt;
&lt;P&gt;What if there were a gap between two date?&lt;/P&gt;
&lt;P&gt;Your code can't get job down .&lt;/P&gt;
&lt;P&gt;Like this :&lt;/P&gt;
&lt;P&gt;1 1 1&lt;/P&gt;
&lt;P&gt;2 1 9&lt;/P&gt;
&lt;P&gt;&amp;lt;-------------&lt;/P&gt;
&lt;P&gt;5 1 5&lt;/P&gt;</description>
      <pubDate>Wed, 28 Sep 2022 11:46:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835581#M330334</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2022-09-28T11:46:36Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835617#M330344</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Tom ,&lt;/P&gt;
&lt;P&gt;What if there were a gap between two date?&lt;/P&gt;
&lt;P&gt;Your code can't get job down .&lt;/P&gt;
&lt;P&gt;Like this :&lt;/P&gt;
&lt;P&gt;1 1 1&lt;/P&gt;
&lt;P&gt;2 1 9&lt;/P&gt;
&lt;P&gt;&amp;lt;-------------&lt;/P&gt;
&lt;P&gt;5 1 5&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Yes. The code assumes there are no gaps in dates.&amp;nbsp; The original poster said they had used PROC EXPAND to fill any date gaps.&lt;/P&gt;</description>
      <pubDate>Wed, 28 Sep 2022 14:18:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835617#M330344</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-28T14:18:17Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835637#M330359</link>
      <description>&lt;P&gt;Yeah, my date will be continuous.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;HHC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 28 Sep 2022 15:19:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/835637#M330359</guid>
      <dc:creator>hhchenfx</dc:creator>
      <dc:date>2022-09-28T15:19:56Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836039#M330571</link>
      <description>&lt;P&gt;Thanks for your solution.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For me it's easier to understand if I do a proc transpose before.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here comes my question. Inside the loop I want to to dynamically use the max(of arr[*]) construct.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But using for example max(of temp(1 --3)) doesn't give the desired result.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I tried as well to construct a command inside the loop "max(temp(1), temp(2))" but I cannot plug this character expression into to max_value line. I thought the resolve and %sysevalf would accomplish this, but I was wrong, at least with my attempts.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc transpose data=have out=wide(drop=_name_) prefix=_;
id date;
by id;
var value;
run;


data wide1;
set wide;
array temp _:;
do i=1 to dim(temp) - cmiss(of temp(*));
if i=1 then max_value=temp(1);
if i=2 then max_value=max(temp(1), temp(2));
if i ge 3 then max_value=max(temp(i), temp(i-1), temp(i-2));
value=temp(i);
date=i;
max_date=vname(temp(whichn(max_value,of temp[*])));
output;
end;
drop i _:;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 30 Sep 2022 10:47:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836039#M330571</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T10:47:40Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836053#M330582</link>
      <description>&lt;P&gt;You cannot do that.&lt;/P&gt;
&lt;P&gt;The code for a data step is fixed before the data step starts running.&amp;nbsp; You cannot use macro code to change the SAS code after the step has started executing (even if you could figure out a way to pass the value of the dataset variable to the macro processor).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Which is one reason processing the vertical table is so much easier.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Just use a DO loops and keep track of the maximum value seen in the inner loop.&amp;nbsp; Since you stuffed the dates into the variable names you will have to add logic to extract the name back from the variable name.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data wide1;
  set wide;
  array temp _:;
  do start = 1 to dim(temp);
    max_value=.;
    max_date=.;
    do back=max(1,start-2) to start;
      if temp[back] &amp;gt; max_value then do;
        max_value=temp[back];
        max_date=input(substr(vname(temp[back]),2),32.);
      end;
    end;
    output;
  end;
  keep id start max_value max_date ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You could also still use the circular array trick, by then did you bother with transposing the data?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 12:44:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836053#M330582</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-30T12:44:13Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836059#M330585</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;&amp;nbsp;, by the way.&lt;/P&gt;
&lt;P&gt;It's you who received an award at the SAS Explore event, right?&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:07:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836059#M330585</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T13:07:50Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836061#M330587</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/127222"&gt;@acordes&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;&amp;nbsp;, by the way.&lt;/P&gt;
&lt;P&gt;It's you who received an award at the SAS Explore event, right?&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Yes.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://communities.sas.com/t5/SAS-Explore/2022-SAS-Customer-Recognition-Award-Winners/m-p/835967/emcs_t/S2h8ZW1haWx8bWVudGlvbl9zdWJzY3JpcHRpb258TDhOTlA0MzFHUENNWDJ8ODM1OTY3fEFUX01FTlRJT05TfGhL#M24" target="_blank"&gt;https://communities.sas.com/t5/SAS-Explore/2022-SAS-Customer-Recognition-Award-Winners/m-p/835967/emcs_t/S2h8ZW1haWx8bWVudGlvbl9zdWJzY3JpcHRpb258TDhOTlA0MzFHUENNWDJ8ODM1OTY3fEFUX01FTlRJT05TfGhL#M24&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:14:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836061#M330587</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-30T13:14:59Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836062#M330588</link>
      <description>&lt;P&gt;Congrats and many thanks for the many things I've learned from you and other super users.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But I would like to come back to my thought.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Isn't it possible to create a string with logic as for example "max(temp(1), temp(2))" (for i=2) and use it for the max_value as argument?&lt;/P&gt;
&lt;P&gt;So I would need to resolve the cat string and use it as input to the function: max_value=resolve(cat_string);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:21:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836062#M330588</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T13:21:57Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836066#M330590</link>
      <description>&lt;P&gt;Not sure what you are asking.&lt;/P&gt;
&lt;P&gt;You could use macro code to generate "wall paper" code like:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;array values _: ;
array max_values [100] ;
max_values[1] =values[1];
max_values[2] =max(values[1],values[2]);
max_values[3]=max(values[1].values[2],values[3]);
max_values[4]=max(values[2],values[3].values[4]);
....&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But why?&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:30:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836066#M330590</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-30T13:30:36Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836067#M330591</link>
      <description>&lt;P&gt;Knowing this will be helpful in other ocasion.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I could refine my question in the following way:&lt;/P&gt;
&lt;P&gt;If I have a string like "max(temp(1), temp(2));" stored in a variable cat_str, is it possible to use this in a function.&lt;/P&gt;
&lt;P&gt;instead of writing explicitely max_value=max(temp(1), temp(2)); I am looking for using cat_str within the line like max_value=resolve or whatever (cat_str)&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:36:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836067#M330591</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T13:36:55Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836068#M330592</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/127222"&gt;@acordes&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Knowing this will be helpful in other ocasion.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I could refine my question in the following way:&lt;/P&gt;
&lt;P&gt;If I have a string like "max(temp(1), temp(2));" stored in a variable cat_str, is it possible to use this in a function.&lt;/P&gt;
&lt;P&gt;instead of writing explicitely max_value=max(temp(1), temp(2)); I am looking for using cat_str within the line like max_value=resolve or whatever (cat_str)&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;No.&amp;nbsp; You can use the content of a variable to generate SAS code.&amp;nbsp; You can do it with CALL EXECUTE() or just using PUT statement to write to a file.&amp;nbsp; But that code will run AFTER the current data step finishes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can use RESOLVE() to retrieve the results of macro code execution.&amp;nbsp; But the macro code will not have access to the data that the data step is using.&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 13:47:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836068#M330592</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-30T13:47:15Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836082#M330597</link>
      <description>Tom, that's clear now.&lt;BR /&gt;But have a look at &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt; 's post.&lt;BR /&gt;&lt;A href="https://communities.sas.com/t5/SAS-Programming/resolving-a-formula-in-a-dataset/m-p/68123" target="_blank"&gt;https://communities.sas.com/t5/SAS-Programming/resolving-a-formula-in-a-dataset/m-p/68123&lt;/A&gt;&lt;BR /&gt;Isn't this what I'm looking for?</description>
      <pubDate>Fri, 30 Sep 2022 14:41:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836082#M330597</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T14:41:05Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836094#M330600</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/127222"&gt;@acordes&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;Tom, that's clear now.&lt;BR /&gt;But have a look at &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt; 's post.&lt;BR /&gt;&lt;A href="https://communities.sas.com/t5/SAS-Programming/resolving-a-formula-in-a-dataset/m-p/68123" target="_blank" rel="noopener"&gt;https://communities.sas.com/t5/SAS-Programming/resolving-a-formula-in-a-dataset/m-p/68123&lt;/A&gt;&lt;BR /&gt;Isn't this what I'm looking for?&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;If you read that thread it is saying the same thing as I am saying.&amp;nbsp; Either use the string data to generate code to run later.&amp;nbsp; Or jump through hoops to push that data into text that can be passed to the %sysevalf() macro function via the resolve() function.&amp;nbsp; In the marked answer the convert the string var into the character string that represents the value of var before pushing it to the macro processor to be evaluated.&lt;/P&gt;</description>
      <pubDate>Fri, 30 Sep 2022 14:50:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836094#M330600</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-09-30T14:50:03Z</dc:date>
    </item>
    <item>
      <title>Re: Find location of Moving max per group</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836097#M330601</link>
      <description>Have a nice weekend</description>
      <pubDate>Fri, 30 Sep 2022 14:54:26 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Find-location-of-Moving-max-per-group/m-p/836097#M330601</guid>
      <dc:creator>acordes</dc:creator>
      <dc:date>2022-09-30T14:54:26Z</dc:date>
    </item>
  </channel>
</rss>

