<?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 Choosing last and second last dates in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702934#M215335</link>
    <description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;I have several dates for IDs and i need to choose the last and second last dates. I know how to get the last date but i am having trouble trying to find the second last. For example for ID#2: 4/20/2020 is the last date and the date previous to the last date is 2/17/2020.&lt;/P&gt;
&lt;P&gt;Have:&lt;/P&gt;
&lt;TABLE width="140"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="76"&gt;d_date&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;11/1/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;5/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;8/31/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/2/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;2/17/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;4/20/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5/18/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;12/17/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;10/13/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;7/10/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;4/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;12/27/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/23/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/23/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;6/21/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/20/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;2/24/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data Want:&lt;/P&gt;
&lt;TABLE width="222"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="76"&gt;D_last&lt;/TD&gt;
&lt;TD width="82"&gt;D_secondLast&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;5/3/2020&lt;/TD&gt;
&lt;TD&gt;11/1/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;4/20/2020&lt;/TD&gt;
&lt;TD&gt;2/17/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;7/10/2020&lt;/TD&gt;
&lt;TD&gt;4/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/20/2020&lt;/TD&gt;
&lt;TD&gt;6/21/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
    <pubDate>Tue, 01 Dec 2020 23:55:09 GMT</pubDate>
    <dc:creator>newsas007</dc:creator>
    <dc:date>2020-12-01T23:55:09Z</dc:date>
    <item>
      <title>Choosing last and second last dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702934#M215335</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;I have several dates for IDs and i need to choose the last and second last dates. I know how to get the last date but i am having trouble trying to find the second last. For example for ID#2: 4/20/2020 is the last date and the date previous to the last date is 2/17/2020.&lt;/P&gt;
&lt;P&gt;Have:&lt;/P&gt;
&lt;TABLE width="140"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="76"&gt;d_date&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;11/1/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;5/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;8/31/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/2/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;2/17/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;4/20/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;5/18/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;12/17/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;10/13/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;7/10/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;4/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;12/27/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/23/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/23/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;6/21/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/20/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;2/24/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data Want:&lt;/P&gt;
&lt;TABLE width="222"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="76"&gt;D_last&lt;/TD&gt;
&lt;TD width="82"&gt;D_secondLast&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;5/3/2020&lt;/TD&gt;
&lt;TD&gt;11/1/2019&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;4/20/2020&lt;/TD&gt;
&lt;TD&gt;2/17/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;3&lt;/TD&gt;
&lt;TD&gt;7/10/2020&lt;/TD&gt;
&lt;TD&gt;4/3/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;4&lt;/TD&gt;
&lt;TD&gt;9/20/2020&lt;/TD&gt;
&lt;TD&gt;6/21/2020&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Tue, 01 Dec 2020 23:55:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702934#M215335</guid>
      <dc:creator>newsas007</dc:creator>
      <dc:date>2020-12-01T23:55:09Z</dc:date>
    </item>
    <item>
      <title>Re: Choosing last and second last dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702937#M215338</link>
      <description>&lt;P&gt;One way: sort by Id and DESCENDING date. The the first and second are the ones you want.&lt;/P&gt;
&lt;P&gt;Run a counter that is reset for each ID.&lt;/P&gt;
&lt;P&gt;While the counter is less than or equal to 2 do what you need and then output at count=2 (or last of the ID in case an ID only has one).&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2020 00:20:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702937#M215338</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2020-12-02T00:20:48Z</dc:date>
    </item>
    <item>
      <title>Re: Choosing last and second last dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702948#M215343</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/336862"&gt;@newsas007&lt;/a&gt;&amp;nbsp; It appears the last date for ID2 is 5/18/2020. Can you please revie&lt;SPAN&gt;w&lt;/SPAN&gt; your expected result. Other&lt;SPAN&gt;wise it's simple-&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data have;
input ID	d_date :mmddyy10.;
format d_date mmddyy10.;
cards;
1	11/1/2019
1	5/3/2020
2	8/31/2019
2	9/2/2019
2	2/17/2020
2	4/20/2020
2	5/18/2020
2	12/17/2019
2	10/13/2019
3	7/10/2020
3	4/3/2020
3	12/27/2019
4	9/23/2019
4	9/23/2019
4	6/21/2020
4	9/20/2020
4	2/24/2020
;

data Want;
 do _n_=1 by 1 until(last.id);
   set have;
   by id;
   array t(99999) _temporary_;
   t(_n_)=d_date;
 end;
 d_last=max(of t(*));
 d_2nd_last=largest(2,of t(*));
 call missing(of t(*));
 format d_last d_2nd_last mmddyy10.;
 drop d_date;
run;


&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 02 Dec 2020 01:13:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702948#M215343</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2020-12-02T01:13:19Z</dc:date>
    </item>
    <item>
      <title>Re: Choosing last and second last dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702961#M215345</link>
      <description>&lt;P&gt;This is a case where the use of arrays in which you carefully name two of the array elements, plus a call sortn statement, can simplify:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input ID	d_date :mmddyy10.;
format d_date mmddyy10.;
cards;
1	11/1/2019
1	5/3/2020
2	8/31/2019
2	9/2/2019
2	2/17/2020
2	4/20/2020
2	5/18/2020
2	12/17/2019
2	10/13/2019
3	7/10/2020
3	4/3/2020
3	12/27/2019
4	9/23/2019
4	9/23/2019
4	6/21/2020
4	9/20/2020
4	2/24/2020
;

data want (keep=id d_last d_second_last);
  do i=1 by 1 until (last.id);
    set have ;
    by id ;
    format d_last d_second_last mmddyy10.;
    array dats{20} d1-d18 d_second_last d_last;
    dats{i}=d_date;
  end;
  call sortn(of dats{*});
run;

 	&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Just give the array a dimension (20 in the above case) that is large enough to accommodate the most populated id.&amp;nbsp; And when you name the variables belonging to the array, &lt;EM&gt;&lt;STRONG&gt;make the last two names&lt;/STRONG&gt; &lt;STRONG&gt;d_second_last&lt;/STRONG&gt;&lt;/EM&gt; and &lt;EM&gt;&lt;STRONG&gt;d_last&lt;/STRONG&gt;&lt;/EM&gt;, preceded by two fewer dummy names than the array size, d1-d18 here.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The call sortn will put the largest two date values in the final two elements of the array, conveniently pre-named as the desired result variables. No further assignment required.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I put the format statement and the array statement in the given locations just to force the sas compiler to make ID the leftmost variable followed by D_LAST and D_SECOND_LAST.&amp;nbsp; You could put it anywhere.&amp;nbsp; And you could put the array statement anywhere prior to the "dats{i}=" assignment statement.&lt;/P&gt;</description>
      <pubDate>Wed, 02 Dec 2020 04:24:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Choosing-last-and-second-last-dates/m-p/702961#M215345</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2020-12-02T04:24:48Z</dc:date>
    </item>
  </channel>
</rss>

