<?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: Fill in missing dates in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700641#M214436</link>
    <description>&lt;P&gt;I know a solution has already been accepted, but I offer this as an example of avoiding sorting of data set files:&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 truncover;
input ID $ LOT_Start :mmddyy10. LOT_End :mmddyy10. LOT $;
format lot_start lot_end yymmdd10.;
datalines;
1,7/8/2016,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,10/9/2016,Second 
2,7/22/2016,8/21/2016,First 
2,,8/21/2016,First 
2,8/22/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,11/12/2016,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,3/19/2017,,Third 
2,3/19/2017,,Third 
2,3/19/2017,1/23/2018,Third 
2,,4/2/2018,Fourth
;

data want (drop=_:);

  array _start{0:30} _temporary_;
  array _end{0:30} _temporary_;

  call missing(of _start{*},of _end{*});

  do _n=1 by 1 until (last.lot);  /* Carry forward lot_start*/
    set have;
	by id lot notsorted;
	_start{_n}=coalesce(lot_start,_start{_n-1});
	if lot_end^=. then _end{_n}=lot_end;
  end;

  do _n=_n to 1 by -1;;   /* Carry backward lot_end*/
    if _end{_n}=. then _end{_n}=_end{_n+1};
  end;

  do _n=1 by 1 until (last.lot);  /* Reread and retrieve carried values*/
    set have;
	by id lot notsorted;
	lot_start=coalesce(lot_start,_start{_n});
	lot_end=coalesce(lot_end,_end{_n});
    output;
  end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;Editted note:&amp;nbsp; The array lower bounds are set to 0 (to prevent error messages from the &lt;EM&gt;&lt;STRONG&gt;coalesce(lot_start,_start{_n-1})&lt;/STRONG&gt;&lt;/EM&gt; expression).&amp;nbsp; And set the upper bounds to some number you know will accommodate the largest ID/LOT group.&lt;/P&gt;</description>
    <pubDate>Sat, 21 Nov 2020 03:58:40 GMT</pubDate>
    <dc:creator>mkeintz</dc:creator>
    <dc:date>2020-11-21T03:58:40Z</dc:date>
    <item>
      <title>Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700500#M214386</link>
      <description>&lt;P&gt;Hi all,&lt;/P&gt;
&lt;P&gt;The dataset below has some missing dates that i need to fill in. I need LOT_start and LOT_stop dates filled in cells that are empty specific to the LOT and ID. Also, when there is no start or end dates, then it has to be left missing. For example: ID#2 for LOT = fourth there is no LOT_Start date, so therefore should be left missing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Data Have:&lt;/P&gt;
&lt;TABLE width="308"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="73"&gt;LOT_Start&lt;/TD&gt;
&lt;TD width="73"&gt;LOT_End&lt;/TD&gt;
&lt;TD width="98"&gt;LOT&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;7/22/2016&lt;/TD&gt;
&lt;TD&gt;8/21/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;8/21/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;8/22/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/10/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/10/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;11/12/2016&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;1/23/2018&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;4/2/2018&lt;/TD&gt;
&lt;TD&gt;Fourth&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="274"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="64"&gt;ID&lt;/TD&gt;
&lt;TD width="73"&gt;LOT_Start&lt;/TD&gt;
&lt;TD width="73"&gt;LOT_End&lt;/TD&gt;
&lt;TD width="64"&gt;LOT&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;TD&gt;7/8/2016&lt;/TD&gt;
&lt;TD&gt;10/9/2016&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;7/22/2016&lt;/TD&gt;
&lt;TD&gt;8/21/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;7/23/2016&lt;/TD&gt;
&lt;TD&gt;8/21/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;8/22/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/10/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;9/10/2016&lt;/TD&gt;
&lt;TD&gt;11/11/2016&lt;/TD&gt;
&lt;TD&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;11/12/2016&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;11/12/2016&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;11/12/2016&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;11/15/2016&lt;/TD&gt;
&lt;TD&gt;3/18/2017&lt;/TD&gt;
&lt;TD&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;1/23/2018&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;1/23/2018&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;3/19/2017&lt;/TD&gt;
&lt;TD&gt;1/23/2018&lt;/TD&gt;
&lt;TD&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;2&lt;/TD&gt;
&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;4/2/2018&lt;/TD&gt;
&lt;TD&gt;Fourth&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Fri, 20 Nov 2020 18:03:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700500#M214386</guid>
      <dc:creator>newsas007</dc:creator>
      <dc:date>2020-11-20T18:03:17Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700537#M214390</link>
      <description>&lt;P&gt;Try this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
infile datalines dlm="," dsd truncover;
input ID $ LOT_Start :mmddyy10. LOT_End :mmddyy10. LOT $;
format lot_start lot_end yymmdd10.;
datalines;
1,7/8/2016,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,10/9/2016,Second 
2,7/22/2016,8/21/2016,First 
2,,8/21/2016,First 
2,8/22/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,11/12/2016,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,3/19/2017,,Third 
2,3/19/2017,,Third 
2,3/19/2017,1/23/2018,Third 
2,,4/2/2018,Fourth
;

data first;
set have;
by id lot notsorted;
n = _N_;
retain ls;
if first.lot then ls = .;
if lot_start ne .
then ls = lot_start;
else lot_start = ls;
drop ls;
run;

proc sort data=first;
by descending n;
run;

data second;
set first;
by descending id lot notsorted;
retain le;
if first.lot then le = .;
if lot_end ne .
then le = lot_end;
else lot_end = le;
drop le;
run;

proc sort
  data=second
  out=want (drop=n)
;
by n;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;And note how I presented the data in a data step with datalines; please do so yourself in the future, to make it easier for us to help you.&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2020 16:04:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700537#M214390</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-11-20T16:04:48Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700541#M214393</link>
      <description>&lt;P&gt;Why do some of your missing LOT_Start values get set to consecutive dates, while other are set to constants?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For ID=1,LOT=Second, all your missing LOT_Start values are set to 7/8/2016.&lt;/P&gt;
&lt;P&gt;But for ID=2, LOT=Second, the missing LOT_Start values are set to 11/13/2016, 11/14/2016, and 11/15/2016.&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2020 16:22:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700541#M214393</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2020-11-20T16:22:11Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700553#M214398</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; For what it's worth, here is my stab at it-&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;
data have;
 input ID	(LOT_Start	LOT_End	) (:mmddyy10.)LOT $;
 format lot_: mmddyy10.;
 cards;
1	7/8/2016	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	.	Second&amp;nbsp;
1	.	10/9/2016	Second&amp;nbsp;
2	7/22/2016	8/21/2016	First&amp;nbsp;
2	.	8/21/2016	First&amp;nbsp;
2	8/22/2016	11/11/2016	First&amp;nbsp;
2	9/10/2016	11/11/2016	First&amp;nbsp;
2	9/10/2016	11/11/2016	First&amp;nbsp;
2	11/12/2016	3/18/2017	Second&amp;nbsp;
2	.	3/18/2017	Second&amp;nbsp;
2	.	3/18/2017	Second&amp;nbsp;
2	.	3/18/2017	Second&amp;nbsp;
2	3/19/2017	.	Third&amp;nbsp;
2	3/19/2017	.	Third&amp;nbsp;
2	3/19/2017	1/23/2018	Third&amp;nbsp;
2	.	4/2/2018	Fourth
;

proc sql;
 create table temp as 
 select id,lot, min(lot_start)as l_s,min(lot_end) as l_e
 from have
 group by id,lot;
quit;

data want;
 if _n_=1 then do;
  if 0 then set have temp;
  dcl hash h(dataset:'temp');
  h.definekey('id','lot');
  h.definedata('l_s','l_e');
  h.definedone();
 end;
 do until(last.lot);
  set have;
  by id lot notsorted;
  if first.lot then h.find();
  if lot_start then _n3=lot_start;
  else do;
   _n3=ifn(_n1,sum(_n3,1),_n3);
   lot_start=_n3;
  end;
  if lot_end then _n4=lot_end;
  else  do;
   _n4=ifn(_n2,sum(_n4,1),_n4);
   lot_end=_n4;
  end;
  if l_s=lot_start then _n1=1;
  if l_e=lot_end then _n2=1;
  if n(lot_start,_n1)=0 then lot_start=l_s;
  if n(lot_end,_n2)=0 then lot_end=l_e;
  output;
 end;
 keep id lot_start lot_end lot;
run;

proc print noobs;run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;
&lt;DIV align="center"&gt;
&lt;TABLE class="table" summary="Procedure Print: Data Set WORK.WANT" frame="box" rules="all" cellspacing="0" cellpadding="5"&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="r header" scope="col"&gt;ID&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;LOT_Start&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;LOT_End&lt;/TH&gt;
&lt;TH class="l header" scope="col"&gt;LOT&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/08/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/09/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/10/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/11/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/12/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/13/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/14/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;1&lt;/TD&gt;
&lt;TD class="r data"&gt;07/15/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;10/09/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;07/22/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;08/21/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;07/23/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;08/21/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;08/22/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;11/11/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;09/10/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;11/11/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;09/10/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;11/11/2016&lt;/TD&gt;
&lt;TD class="l data"&gt;First&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;11/12/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2017&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;11/13/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2017&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;11/14/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2017&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;11/15/2016&lt;/TD&gt;
&lt;TD class="r data"&gt;03/18/2017&lt;/TD&gt;
&lt;TD class="l data"&gt;Second&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;03/19/2017&lt;/TD&gt;
&lt;TD class="r data"&gt;01/23/2018&lt;/TD&gt;
&lt;TD class="l data"&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;03/19/2017&lt;/TD&gt;
&lt;TD class="r data"&gt;01/23/2018&lt;/TD&gt;
&lt;TD class="l data"&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;03/19/2017&lt;/TD&gt;
&lt;TD class="r data"&gt;01/23/2018&lt;/TD&gt;
&lt;TD class="l data"&gt;Third&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="r data"&gt;2&lt;/TD&gt;
&lt;TD class="r data"&gt;.&lt;/TD&gt;
&lt;TD class="r data"&gt;04/02/2018&lt;/TD&gt;
&lt;TD class="l data"&gt;Fourth&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Fri, 20 Nov 2020 18:03:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700553#M214398</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2020-11-20T18:03:02Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700562#M214405</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461"&gt;@mkeintz&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;Why do some of your missing LOT_Start values get set to consecutive dates, while other are set to constants?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For ID=1,LOT=Second, all your missing LOT_Start values are set to 7/8/2016.&lt;/P&gt;
&lt;P&gt;But for ID=2, LOT=Second, the missing LOT_Start values are set to 11/13/2016, 11/14/2016, and 11/15/2016.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Any bets the increment behavior is from using Excel and dragging a cell without paying attention to results?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I can't remember how many times I have had to fix data related to people using Excel for data entry and doing that for "repeated" values. One data file like that added over 130 school districts to our school system each with exactly one student.&lt;/P&gt;</description>
      <pubDate>Fri, 20 Nov 2020 19:30:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700562#M214405</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2020-11-20T19:30:15Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700573#M214409</link>
      <description>Yes, it is from excel dragging..I am usually careful but it happened again. So sorry.</description>
      <pubDate>Fri, 20 Nov 2020 18:04:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700573#M214409</guid>
      <dc:creator>newsas007</dc:creator>
      <dc:date>2020-11-20T18:04:01Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700577#M214411</link>
      <description>&lt;P&gt;Or just&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;

data want;
 do _n_=1 by 1 until(last.lot);
  set have;
  by id lot notsorted;
  if lot_start then  l_s=min(l_s,lot_start);
  if lot_end then l_e=min(l_e,lot_end);
 end;
 do _n_=1 to _n_;
  set have;
  if lot_start then _n3=lot_start;
  else do;
   _n3=ifn(_n1,sum(_n3,1),_n3);
   lot_start=_n3;
  end;
  if lot_end then _n4=lot_end;
  else  do;
   _n4=ifn(_n2,sum(_n4,1),_n4);
   lot_end=_n4;
  end;
  if l_s=lot_start then _n1=1;
  if l_e=lot_end then _n2=1;
  if n(lot_start,_n1)=0 then lot_start=l_s;
  if n(lot_end,_n2)=0 then lot_end=l_e;
  output;
 end;
 keep id lot_start lot_end lot;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 20 Nov 2020 18:27:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700577#M214411</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2020-11-20T18:27:47Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700632#M214432</link>
      <description>This is great! there was a subtle change in the data though. The blank dates in the data don't need to increment by a day. &lt;BR /&gt;Also, is there anyway to PROC SQL to accomplish this? Thanks</description>
      <pubDate>Fri, 20 Nov 2020 22:55:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700632#M214432</guid>
      <dc:creator>newsas007</dc:creator>
      <dc:date>2020-11-20T22:55:38Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700641#M214436</link>
      <description>&lt;P&gt;I know a solution has already been accepted, but I offer this as an example of avoiding sorting of data set files:&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 truncover;
input ID $ LOT_Start :mmddyy10. LOT_End :mmddyy10. LOT $;
format lot_start lot_end yymmdd10.;
datalines;
1,7/8/2016,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,,Second 
1,,10/9/2016,Second 
2,7/22/2016,8/21/2016,First 
2,,8/21/2016,First 
2,8/22/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,9/10/2016,11/11/2016,First 
2,11/12/2016,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,,3/18/2017,Second 
2,3/19/2017,,Third 
2,3/19/2017,,Third 
2,3/19/2017,1/23/2018,Third 
2,,4/2/2018,Fourth
;

data want (drop=_:);

  array _start{0:30} _temporary_;
  array _end{0:30} _temporary_;

  call missing(of _start{*},of _end{*});

  do _n=1 by 1 until (last.lot);  /* Carry forward lot_start*/
    set have;
	by id lot notsorted;
	_start{_n}=coalesce(lot_start,_start{_n-1});
	if lot_end^=. then _end{_n}=lot_end;
  end;

  do _n=_n to 1 by -1;;   /* Carry backward lot_end*/
    if _end{_n}=. then _end{_n}=_end{_n+1};
  end;

  do _n=1 by 1 until (last.lot);  /* Reread and retrieve carried values*/
    set have;
	by id lot notsorted;
	lot_start=coalesce(lot_start,_start{_n});
	lot_end=coalesce(lot_end,_end{_n});
    output;
  end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;Editted note:&amp;nbsp; The array lower bounds are set to 0 (to prevent error messages from the &lt;EM&gt;&lt;STRONG&gt;coalesce(lot_start,_start{_n-1})&lt;/STRONG&gt;&lt;/EM&gt; expression).&amp;nbsp; And set the upper bounds to some number you know will accommodate the largest ID/LOT group.&lt;/P&gt;</description>
      <pubDate>Sat, 21 Nov 2020 03:58:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700641#M214436</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2020-11-21T03:58:40Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700985#M214602</link>
      <description>I noticed a small error in this code. Say if i change the dataset a bit where LOT_END for ID#2 in LOT = 'Third' is listed differently the code gives a empty cell. Please see below:&lt;BR /&gt;&lt;BR /&gt;data have;&lt;BR /&gt;infile datalines dlm="," dsd truncover;&lt;BR /&gt;input ID $ LOT_Start :mmddyy10. LOT_End :mmddyy10. LOT $;&lt;BR /&gt;format lot_start lot_end yymmdd10.;&lt;BR /&gt;datalines;&lt;BR /&gt;1,7/8/2016,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,,Second &lt;BR /&gt;1,,10/9/2016,Second &lt;BR /&gt;2,7/22/2016,8/21/2016,First &lt;BR /&gt;2,,8/21/2016,First &lt;BR /&gt;2,8/22/2016,11/11/2016,First &lt;BR /&gt;2,9/10/2016,11/11/2016,First &lt;BR /&gt;2,9/10/2016,11/11/2016,First &lt;BR /&gt;2,11/12/2016,3/18/2017,Second &lt;BR /&gt;2,,3/18/2017,Second &lt;BR /&gt;2,,3/18/2017,Second &lt;BR /&gt;2,,3/18/2017,Second &lt;BR /&gt;2,3/19/2017,,Third &lt;BR /&gt;2,3/19/2017,1/23/2018,Third &lt;BR /&gt;2,3/19/2017,,Third &lt;BR /&gt;2,,4/2/2018,Fourth&lt;BR /&gt;;&lt;BR /&gt;&lt;BR /&gt;data first;&lt;BR /&gt;set have;&lt;BR /&gt;by id lot notsorted;&lt;BR /&gt;n = _N_;&lt;BR /&gt;retain ls;&lt;BR /&gt;if first.lot then ls = .;&lt;BR /&gt;if lot_start ne .&lt;BR /&gt;then ls = lot_start;&lt;BR /&gt;else lot_start = ls;&lt;BR /&gt;drop ls;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;proc sort data=first;&lt;BR /&gt;by descending n;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;data second;&lt;BR /&gt;set first;&lt;BR /&gt;by descending id lot notsorted;&lt;BR /&gt;retain le;&lt;BR /&gt;if first.lot then le = .;&lt;BR /&gt;if lot_end ne .&lt;BR /&gt;then le = lot_end;&lt;BR /&gt;else lot_end = le;&lt;BR /&gt;drop le;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;proc sort&lt;BR /&gt;  data=second&lt;BR /&gt;  out=want (drop=n)&lt;BR /&gt;;&lt;BR /&gt;by n;&lt;BR /&gt;run;&lt;BR /&gt; &lt;BR /&gt;</description>
      <pubDate>Mon, 23 Nov 2020 17:48:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700985#M214602</guid>
      <dc:creator>newsas007</dc:creator>
      <dc:date>2020-11-23T17:48:11Z</dc:date>
    </item>
    <item>
      <title>Re: Fill in missing dates</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700987#M214603</link>
      <description>&lt;P&gt;Then you need to add a "carry forward" in the first data step:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data first;
set have;
by id lot notsorted;
n = _N_;
retain ls le;
if first.lot
then do;
  ls = .;
  le = .;
end;
if lot_start ne .
then ls = lot_start;
else lot_start = ls;
if lot_end ne .
then le = lot_end;
else lot_end = le;
drop ls le;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Mon, 23 Nov 2020 17:56:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fill-in-missing-dates/m-p/700987#M214603</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-11-23T17:56:09Z</dc:date>
    </item>
  </channel>
</rss>

