<?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: How do i retrieve next value by a condition? in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844760#M333969</link>
    <description>&lt;P&gt;See here an example of your data in usable form:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm="|" dsd;
input
  date :yymmn6.
  flag1
  flag2
  id :$1.
  flag : $30.
  finish_date :yymmn6.
  months_to_receive
;
format date finish_date yymmn6.;
datalines;
202201|1|1|A|RECEIVED - OK|.|0
202202|1|2|A|N/RECEIVED - FIRST MONTH|202204|2
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;It is assumed that date and finish_date are in fact SAS date values with proper formatting.&lt;/P&gt;
&lt;P&gt;Expand on this, and post it; make corrections where necessary so that the resulting dataset has the same attributes as your original dataset.&lt;/P&gt;</description>
    <pubDate>Thu, 17 Nov 2022 08:20:31 GMT</pubDate>
    <dc:creator>Kurt_Bremser</dc:creator>
    <dc:date>2022-11-17T08:20:31Z</dc:date>
    <item>
      <title>How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844735#M333960</link>
      <description>&lt;P&gt;Hello!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I need some help to retrieve values in the "next" lines of a report to create some metrics, look, i have the FLAG_1 and FLAG_2.&lt;/P&gt;&lt;P&gt;When flag_1 and flag_2 are equal to 1 the ID received the delivery okay, finish date is equal "-" and MONTHS_TO_RECEIVE equal 0&lt;/P&gt;&lt;P&gt;When flag_1 = 1 and flag_2 = 2 the ID didn't received in the currently month, so the months_to_receive need to be fill with the DATE (i put in bold to help look from where i retrieve the value) of the receive, the date is the next time when flag_1 =2 and flag_2 = 1.&amp;nbsp;&lt;/P&gt;&lt;P&gt;In my data i have filled date, flag_1, flag_2, id and flag, i need to create the finish date, any idea? I tried first, retain and last...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;DATE&lt;/TD&gt;&lt;TD&gt;FLAG_1&lt;/TD&gt;&lt;TD&gt;FLAG_2&lt;/TD&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;FLAG&lt;/TD&gt;&lt;TD&gt;FINISH_DATE&lt;/TD&gt;&lt;TD&gt;MONTHS_TO_RECEIVE&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202201&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - OK&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202202&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - FIRST MONTH&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;202204&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202203&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - WAITING&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;202204&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - LATE&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202205&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - OK&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202206&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - FIRST MONTH&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;202209&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202207&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - WAITING&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202208&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - WAITING&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;202209&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - LATE&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202210&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - OK&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;202211&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;N/RECEIVED - FIRST MONTH&lt;/TD&gt;&lt;TD&gt;&lt;STRONG&gt;202212&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&lt;STRONG&gt;202212&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;A&lt;/TD&gt;&lt;TD&gt;RECEIVED - LATE&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;TD&gt;-&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I tried:&lt;/P&gt;&lt;PRE&gt;DATA TEST2;
SET TEST;
RETAIN FINISH_DATE;
IF FLAG_1 = 1 AND FLAG_2 = 2 THEN
FINISH_DATE =&amp;nbsp; FINISH_DATE;
BY ID DATE;
RUN;&lt;/PRE&gt;&lt;P&gt;But, the same ID can receive or not in other date's. Someone can help me?&lt;/P&gt;&lt;PRE&gt;data have;
infile datalines dlm="|" dsd;
input
  date 
  flag1
  flag2
  id :$1.
  flag : $30.
  finish_date
  months_to_receive
;
datalines;
202201|1|1|A|RECEIVED - OK|-|0
202202|1|2|A|N/RECEIVED - FIRST MONTH|202204|2
202203|2|2|A|N/RECEIVED - WAITING|-|-
202204|2|1|A|RECEIVED - LATE|-|-
202205|1|1|A|RECEIVED - OK|-|0
202206|1|2|A|N/RECEIVED - FIRST MONTH|202209|3
202207|2|2|A|N/RECEIVED - WAITING|-|-
202208|2|2|A|N/RECEIVED - WAITING|-|-
202209|2|1|A|RECEIVED - LATE|-|-
202210|1|1|A|RECEIVED - OK|-|0
202211|1|2|A|N/RECEIVED - FIRST MONTH|202212|1
202212|2|2|A|RECEIVED - LATE|-|-
;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Nov 2022 11:56:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844735#M333960</guid>
      <dc:creator>Thiago_Oliv</dc:creator>
      <dc:date>2022-11-17T11:56:15Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844753#M333967</link>
      <description>&lt;P&gt;As always: please post data in usable form, so that we have something to work with that meets the data you have. This is extra-important if dates are in the data.&lt;/P&gt;</description>
      <pubDate>Thu, 17 Nov 2022 06:56:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844753#M333967</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2022-11-17T06:56:36Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844760#M333969</link>
      <description>&lt;P&gt;See here an example of your data in usable form:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm="|" dsd;
input
  date :yymmn6.
  flag1
  flag2
  id :$1.
  flag : $30.
  finish_date :yymmn6.
  months_to_receive
;
format date finish_date yymmn6.;
datalines;
202201|1|1|A|RECEIVED - OK|.|0
202202|1|2|A|N/RECEIVED - FIRST MONTH|202204|2
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;It is assumed that date and finish_date are in fact SAS date values with proper formatting.&lt;/P&gt;
&lt;P&gt;Expand on this, and post it; make corrections where necessary so that the resulting dataset has the same attributes as your original dataset.&lt;/P&gt;</description>
      <pubDate>Thu, 17 Nov 2022 08:20:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844760#M333969</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2022-11-17T08:20:31Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844772#M333973</link>
      <description>&lt;P&gt;An idea:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;it seems as if all obs having flag = "RECEIVED - LATE" are used as lookup, so the first step is creating a dataset having only those obs while keeping only id and date, renaming date to finish_date seems to be a good idea, too&lt;/LI&gt;
&lt;LI&gt;using the created lookup dataset as hash object, keys are id and finish_date&lt;/LI&gt;
&lt;LI&gt;if flag1 = 1 and flag2 = 2 a loop is started searching the hash object. In each iteration months_to_receive is increased by 1 until a date was found.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The step is hardly tested:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
   set have;

   if _n_= 1 then do;
      if 0 then set lookup;
      declare hash h(dataset: 'lookup');
      h.defineKey('id', 'finish_date');
      h.defineDone();
   end;

   months_to_receive = 0;
   finish_date = .;

   if flag1 = 1 and flag2 = 2 then do;
      months_to_receive = 1;
      do until (not missing(finish_date));
         finish_date = intnx('month', date, months_to_receive, 'b');
         put finish_date=;

         if h.check () ^= 0 then do;
            finish_date = .;
            months_to_receive = months_to_receive + 1;
         end;
      end;
   end;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 17 Nov 2022 09:25:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844772#M333973</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2022-11-17T09:25:39Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844801#M333985</link>
      <description>adjusted!</description>
      <pubDate>Thu, 17 Nov 2022 11:59:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844801#M333985</guid>
      <dc:creator>Thiago_Oliv</dc:creator>
      <dc:date>2022-11-17T11:59:08Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844802#M333986</link>
      <description>posted!</description>
      <pubDate>Thu, 17 Nov 2022 11:59:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/844802#M333986</guid>
      <dc:creator>Thiago_Oliv</dc:creator>
      <dc:date>2022-11-17T11:59:20Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/845098#M334090</link>
      <description>&lt;P&gt;NEVER (as in&amp;nbsp;&lt;U&gt;&lt;STRONG&gt;NEVER!!!!&lt;/STRONG&gt;&lt;/U&gt;&lt;U&gt;)&lt;/U&gt; store date values like this. Not even when hell freezes over so hard that the brimstone turns superconducting.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Always store date values as SAS dates, so you can make use of formats and functions provided by the SAS system.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm="|" dsd;
input
  date :yymmn6.
  flag1
  flag2
  id :$1.
  flag : $30.
;
formnat date yymmn6.;
datalines;
202201|1|1|A|RECEIVED - OK|-|0
202202|1|2|A|N/RECEIVED - FIRST MONTH|202204|2
202203|2|2|A|N/RECEIVED - WAITING|-|-
202204|2|1|A|RECEIVED - LATE|-|-
202205|1|1|A|RECEIVED - OK|-|0
202206|1|2|A|N/RECEIVED - FIRST MONTH|202209|3
202207|2|2|A|N/RECEIVED - WAITING|-|-
202208|2|2|A|N/RECEIVED - WAITING|-|-
202209|2|1|A|RECEIVED - LATE|-|-
202210|1|1|A|RECEIVED - OK|-|0
202211|1|2|A|N/RECEIVED - FIRST MONTH|202212|1
202212|2|2|A|RECEIVED - LATE|-|-
;

proc sql;
create table want as
  select
    t1.*,
        case
      when t1.flag1 = 1 and t1.flag2 = 2
      then t2.date
      else .
    end as date_finished format=yymmn6.,
    case
      when t1.flag1 = 1 and t1.flag2 = 2
      then intck('month',t1.date,t2.date)
      else .
    end as months_to_receive
  from have t1 left join have t2
  on t1.id = t2.id and t2.flag = "RECEIVED - LATE" and t1.date &amp;lt; t2.date
  group by t1.id, t1.date
  having t2.date = min(t2.date)
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 18 Nov 2022 12:38:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/845098#M334090</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2022-11-18T12:38:00Z</dc:date>
    </item>
    <item>
      <title>Re: How do i retrieve next value by a condition?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/845215#M334124</link>
      <description>&lt;P&gt;For the bottom row (date 202212), why is the value of flag2=2?&amp;nbsp; I ask, because it is apparently the month of a delivery, which I understand should be signified by flag2=1.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Assuming that is an error (which I have corrected below), this code produces what you want.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm="|" dsd;
input
  date :yymmn6.
  flag1
  flag2
  id :$1.
  flag : $30.
;
format date yymmn6.;
datalines;
202201|1|1|A|RECEIVED - OK|-|0
202202|1|2|A|N/RECEIVED - FIRST MONTH|202204|2
202203|2|2|A|N/RECEIVED - WAITING|-|-
202204|2|1|A|RECEIVED - LATE|-|-
202205|1|1|A|RECEIVED - OK|-|0
202206|1|2|A|N/RECEIVED - FIRST MONTH|202209|3
202207|2|2|A|N/RECEIVED - WAITING|-|-
202208|2|2|A|N/RECEIVED - WAITING|-|-
202209|2|1|A|RECEIVED - LATE|-|-
202210|1|1|A|RECEIVED - OK|-|0
202211|1|2|A|N/RECEIVED - FIRST MONTH|202212|1
202212|2|1|A|RECEIVED - LATE|-|-
;


data want (drop=_:);
  do _n=1 by 1 until (flag2=1 or last.id);
    set have;
    by id date;
  end;
  if flag2=1 then _delivery_date=date;  format _delivery_date yymmn6.;

  do _n_=1 to _n;
    set have;
    if      flag1=1 and flag2=1 then finish_date=.S;  /*Same month delivery*/
    else if flag1=2 and flag2=2 then finish_date=.W ; /*Waiting for delivery*/
    else if flag1=1 and flag2=2 then finish_date=_delivery_date;
    else if flag1=2 and flag2=1 then finish_date=.L;  /*Received Late*/
    if finish_date=.S then months_to_receipt=0;
    else if not missing(finish_date) then months_to_receipt=intck('month',date,finish_date);
    output;
    call missing(months_to_receipt);
  end;
  format finish_date yymmn6. ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;This code read each set of records up to a successful delivery (or end of the ID), in order to establish a delivery date.&amp;nbsp; It then rereads (and outputs) the same set of records, generating the variables finish_date and months_to_receipt as needed, using the flag values and the established delivery date.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 18 Nov 2022 21:44:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-do-i-retrieve-next-value-by-a-condition/m-p/845215#M334124</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-11-18T21:44:48Z</dc:date>
    </item>
  </channel>
</rss>

