<?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: Fast way to remove overlapping date spans in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417216#M102481</link>
    <description>&lt;P&gt;Hi Brian,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; master;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end mmddyy10.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 01-01-2016 11-30-2016&lt;/P&gt;&lt;P&gt;B 01-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; exclude;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end mmddyy10.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 07-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;B 09-01-2016 09-30-2016&lt;/P&gt;&lt;P&gt;;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; want;&lt;/P&gt;&lt;P&gt;set master;&lt;/P&gt;&lt;P&gt;set exclude(rename=(start=_start end=_end));&lt;/P&gt;&lt;P&gt;if _end&amp;gt;end then do;&lt;/P&gt;&lt;P&gt;__start=start;&lt;/P&gt;&lt;P&gt;__end=_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;else if _end&amp;lt;end then do;&lt;/P&gt;&lt;P&gt;__start=start;&lt;/P&gt;&lt;P&gt;__end=_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;__start=_end+&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;__end=end;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;end&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;format __start __end mmddyy10.;&lt;/P&gt;&lt;P&gt;keep id __:;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My assumptions:&lt;/P&gt;&lt;P&gt;1. Your sample is representative of your data i.e with unique id's for each row&lt;/P&gt;&lt;P&gt;2. Master and exclude contains equal number of records&lt;/P&gt;&lt;P&gt;3. Also I used extra variables with prefix __ to help us understand what happens in PDV when we do one to one merge. Obviously, you could concise that if you your understanding of PDV is sound by just resetting the original variable values of start and end.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Should it not work, let me know where i am missing the logic&lt;/P&gt;</description>
    <pubDate>Wed, 29 Nov 2017 20:17:17 GMT</pubDate>
    <dc:creator>novinosrin</dc:creator>
    <dc:date>2017-11-29T20:17:17Z</dc:date>
    <item>
      <title>Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417194#M102477</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have several datasets containing various start and end date information and need to remove overlapping dates (see&amp;nbsp;sample code below). For instance, in the below sample,&amp;nbsp;person A had a span of Jan 1 - Nov 30, 2016, and exclude from July 1 - Dec 31, 2016. The resulting start should be Jan 1, 2016 and the end should be June 30, 2016, a day before the exclude start date.&amp;nbsp;Person B had a span of Jan 1 - Dec 2016 and an exclude of Sept 1 - Sept 30, 2016. So they would have two lines for two new start and end dates, the first from Jan 1 - Aug 31, 2016, and another from Oct 1 - Dec 31 2016.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Currently, I am doing this by outputting one row per day and using PROC SQL to exclude where ID and date overlap, then I combine consecutive days back into one line. This works, but the problem is that my datasets are much larger--the largest data views I create have 4-6 billion observations and I need to repeat this procedure several times for different datasets.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My question is whether there is a simple(ish) way that doesn't involve creating a row for each day of enrollment?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data master;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
;
run;

data exclude;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
;run;

data want;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 01-01-2016 06-30-2016
B 01-01-2016 08-31-2016
B 10-01-2016 12-31-2016
;run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;Thank you,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;-Brian&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 19:22:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417194#M102477</guid>
      <dc:creator>bstarr</dc:creator>
      <dc:date>2017-11-29T19:22:13Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417216#M102481</link>
      <description>&lt;P&gt;Hi Brian,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; master;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end mmddyy10.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 01-01-2016 11-30-2016&lt;/P&gt;&lt;P&gt;B 01-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; exclude;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end mmddyy10.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 07-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;B 09-01-2016 09-30-2016&lt;/P&gt;&lt;P&gt;;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; want;&lt;/P&gt;&lt;P&gt;set master;&lt;/P&gt;&lt;P&gt;set exclude(rename=(start=_start end=_end));&lt;/P&gt;&lt;P&gt;if _end&amp;gt;end then do;&lt;/P&gt;&lt;P&gt;__start=start;&lt;/P&gt;&lt;P&gt;__end=_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;else if _end&amp;lt;end then do;&lt;/P&gt;&lt;P&gt;__start=start;&lt;/P&gt;&lt;P&gt;__end=_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;__start=_end+&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;__end=end;&lt;/P&gt;&lt;P&gt;output;&lt;/P&gt;&lt;P&gt;end&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;format __start __end mmddyy10.;&lt;/P&gt;&lt;P&gt;keep id __:;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;My assumptions:&lt;/P&gt;&lt;P&gt;1. Your sample is representative of your data i.e with unique id's for each row&lt;/P&gt;&lt;P&gt;2. Master and exclude contains equal number of records&lt;/P&gt;&lt;P&gt;3. Also I used extra variables with prefix __ to help us understand what happens in PDV when we do one to one merge. Obviously, you could concise that if you your understanding of PDV is sound by just resetting the original variable values of start and end.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Should it not work, let me know where i am missing the logic&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 20:17:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417216#M102481</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2017-11-29T20:17:17Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417225#M102482</link>
      <description>&lt;P&gt;This is similar to what you describe you are doing now.&amp;nbsp; I use 3 views and a PROC SUMMARY to output the ranges.&amp;nbsp; I tested with multiple exclude ranges for an ID but not when the exclude ranges overlap.&amp;nbsp; Requires that MASTER and EXCLUDE are ordered BY ID. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data master;
   informat id $1. start end mmddyy10.;
   format start end mmddyy10.; 
   input id $ start end;
   datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
;
   run;
proc print;
   run;
data masterv / view=masterv;
   set master;
   do date = start to end;
      output;
      end;
   drop start end;
   format date mmddyy10.;
   run;

data exclude;
   informat id $1. start end mmddyy10.;
   format start end mmddyy10.; 
   input id $ start end;
   datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
;
   run;
proc print;
   run;
data excludeV / view=excludeV;
   set exclude;
   do date = start to end;
      output;
      end;
   drop start end;
   run;

data want0 / view=want0;
   merge masterV(in=in1) excludeV(in=in2);
   by id date;
   if in1 and not in2;
   d = dif(date);
   if first.id then do;
      d=1;
      r=1;
      end;
   if d ne 1 then r+1;
   drop d;
   run;
proc summary data=want0 nway;
   by id r;
   var date;
   output out=want1(drop=_type_) min=start max=end;
   run;
proc print;
   run;


data want;
   informat id $1. start end mmddyy10.;
   format start end mmddyy10.; 
   input id $ start end;
   datalines;
A 01-01-2016 06-30-2016
B 01-01-2016 08-31-2016
B 10-01-2016 12-31-2016
;
   run;
proc print;
   run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="2017-11-29_14-31-31.png" style="width: 290px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/16914iBAC5FCD5A1FB8B77/image-size/large?v=v2&amp;amp;px=999" role="button" title="2017-11-29_14-31-31.png" alt="2017-11-29_14-31-31.png" /&gt;&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 20:33:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417225#M102482</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2017-11-29T20:33:34Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417226#M102483</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you for your reply. Unfortunately I have multiple rows per ID, which can vary across source datasets; and the patterns of overlap could be anything. A better sample that's closer to my production data might be&amp;nbsp;more along the lines of the following:&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 master;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
C 01-01-2016 05-31-2016
C 07-01-2016 12-31-2016
;
run;

data exclude;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
B 12-01-2016 12-31-2016
D 01-01-2016 12-31-2016
;
run;&lt;BR /&gt;&lt;BR /&gt;data want;&lt;BR /&gt;informat id $1. start end mmddyy10.;&lt;BR /&gt;format start end mmddyy10.; &lt;BR /&gt;input id $ start end;&lt;BR /&gt;datalines;&lt;BR /&gt;A 01-01-2016 06-30-2016&lt;BR /&gt;B 01-01-2016 08-31-2016&lt;BR /&gt;B 10-01-2016 10-31-2016&lt;BR /&gt;B 12-01-2016 12-31-2016&lt;BR /&gt;C 01-01-2016 05-31-2016&lt;BR /&gt;C 07-01-2016 12-31-2016&lt;BR /&gt;;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 20:36:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417226#M102483</guid>
      <dc:creator>bstarr</dc:creator>
      <dc:date>2017-11-29T20:36:48Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417237#M102484</link>
      <description>&lt;P&gt;Thanks, this is great. Although it's similar in nature to what I'm currently doing, it is much more concise and should save a couple steps.&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 21:02:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417237#M102484</guid>
      <dc:creator>bstarr</dc:creator>
      <dc:date>2017-11-29T21:02:09Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417243#M102486</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/174733"&gt;@bstarr&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;Thanks, this is great. Although it's similar in nature to what I'm currently doing, it is much more concise and should save a couple steps.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I tested with your second post of data but it does not match your WANT.&amp;nbsp; I don't think WANT in is correct in the second post.&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 21:14:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417243#M102486</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2017-11-29T21:14:13Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417249#M102487</link>
      <description>&lt;P&gt;Ah yes. I think I meant to exclude November 2016 for B instead of December, but working with those inputs, WANT should be:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;&lt;BR /&gt;informat id $1. start end mmddyy10.;&lt;BR /&gt;format start end mmddyy10.; &lt;BR /&gt;input id $ start end;&lt;BR /&gt;datalines;&lt;BR /&gt;A 01-01-2016 06-30-2016&lt;BR /&gt;B 01-01-2016 08-31-2016&lt;BR /&gt;B 10-01-2016 11-30-2016&lt;BR /&gt;C 01-01-2016 05-31-2016&lt;BR /&gt;C 07-01-2016 12-31-2016&lt;BR /&gt;;run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;And this is why we have SAS to check human error &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt; Thank you.&lt;/P&gt;</description>
      <pubDate>Wed, 29 Nov 2017 21:23:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417249#M102487</guid>
      <dc:creator>bstarr</dc:creator>
      <dc:date>2017-11-29T21:23:37Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417259#M102489</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Take a look at this code which is something close.&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data master;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
C 01-01-2016 05-31-2016
C 07-01-2016 12-31-2016
;
run;

data exclude;
informat id $1. ex_start ex_end mmddyy10.;
format ex_start ex_end mmddyy10.; 
input id $ ex_start ex_end;
datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
B 12-01-2016 12-31-2016
D 01-01-2016 12-31-2016
;
run;

proc sort data=master;
by id;
proc sort data=exclude;
by id;
data master_exclude(keep=ID start1 end1 start2 end2);
format start end ex_start ex_end start1 end1 start2 end2 mmddyy10.;
merge master exclude;
by id;
if start&amp;lt;=ex_start&amp;lt;=end and start&amp;lt;=ex_end&amp;lt;=end then do;
					start1=start;
					end1=ex_start-1;
					start2=ex_end+1;
					end2=end;
					end;
else if ex_start&amp;lt;start and start&amp;lt;=ex_end&amp;lt;=end then do;
						start1=ex_end+1;
					end1=end;
					end;
else if start&amp;lt;=ex_start&amp;lt;=end and ex_end&amp;gt;end then do;
								start1=start;
								end1=ex_start-1;
								end;
if missing(start1) and missing(end1) then do;
				start1=start;
				end1=end;
			end; 
run;

proc sql;
create table want as
select id,start1 format=mmddyy10. as start, end1 format=mmddyy10. as end
	from master_exclude
	where start1 is not missing and end1 is not missing
union
select id,start2 format=mmddyy10. as start, end2 format=mmddyy10. as end
	from master_exclude
where start2 is not missing and end2 is not missing;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 29 Nov 2017 22:26:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417259#M102489</guid>
      <dc:creator>SuryaKiran</dc:creator>
      <dc:date>2017-11-29T22:26:55Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417337#M102513</link>
      <description>&lt;P&gt;This solution can also be solved via a date indexed array of one-byte characters, in which all dates marked with an 'X' are to be excluded.&amp;nbsp; After first building up all the exclusions array for an ID, just run through the master records for the same ID, and look for X's between start and&amp;nbsp; end:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data master;
format start end mmddyy10.; 
input id $1. start :mmddyy10. end :mmddyy10.;
datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
C 01-01-2016 05-31-2016
C 07-01-2016 12-31-2016
run;

data exclude;
format start end mmddyy10.; 
input id $1. start :mmddyy10. end :mmddyy10.;
datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
B 12-01-2016 12-31-2016
D 01-01-2016 12-31-2016
run;

%let datefirst=01jan2016;
%let datelast=31dec2016;

data want;
  array dates{%sysfunc(inputn(&amp;amp;datefirst,date9.)):%sysfunc(inputn(&amp;amp;datelast,date9.))} $1 _temporary_;

  set exclude (in=inex)  master (in=inmast rename=(start=_s end=_e));
  by id;
  if first.id then call missing(of dates{*});

  if inex then do d=start to end; dates{d}='X'; end;

  if inmast;

  do start=_s to _e;
    if dates{start}=' ' then do end=start to _e until (dates{end}='X');end;
    else continue;
    end=end-1;
    output;
    start=end;
  end;

run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 30 Nov 2017 09:01:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417337#M102513</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-11-30T09:01:46Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417386#M102523</link>
      <description>&lt;P&gt;The simplest solution I can think of is to line all the dates up with a switch variable to mark what happens:&lt;/P&gt;&lt;PRE&gt;data dates;
  set master(in=M) exclude;
  format date mmddyy10.;
  if M then do;
    Switch='M_on ';
    date=start;
    output;
    Switch='M_off';
    date=end;
    output;
    end;
  else do;
    Switch='E_on ';
    date=start;
    output;
    Switch='E_off';
    date=end;
    output;
    end;
  keep id date switch;
run;

proc sort;
  by id date switch; /* We put Exclude before Master on the same date */
run;

data want;
  set dates;
  by id;
  if first.id then do;
    Master=0;
    Exclude=0;
    end;
  select(switch);
    when('M_on') do;
      Master=1;
      start=date;
      end;
    when('M_off') do;
      Master=0;
      if not Exclude then do;
        end=date;
        if end&amp;gt;=start then
          output;
        end;
      end;
    when('E_on') do;
      Exclude=1;
      if Master then do;
        end=date-1;
        if end&amp;gt;=start then
          output;
        end;
      end;
    when('E_off') do;
      Exclude=0;
      if Master then
        start=date+1;
      end;
    end;
  retain start end Master Exclude;
  format start end mmddyy10.;
  keep id start end;
run;&lt;/PRE&gt;</description>
      <pubDate>Thu, 30 Nov 2017 12:28:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417386#M102523</guid>
      <dc:creator>s_lassen</dc:creator>
      <dc:date>2017-11-30T12:28:42Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417399#M102526</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data master;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 01-01-2016 11-30-2016
B 01-01-2016 12-31-2016
C 01-01-2016 05-31-2016
C 07-01-2016 12-31-2016
;
run;

data exclude;
informat id $1. start end mmddyy10.;
format start end mmddyy10.; 
input id $ start end;
datalines;
A 07-01-2016 12-31-2016
B 09-01-2016 09-30-2016
B 12-01-2016 12-31-2016
D 01-01-2016 12-31-2016
;
data master1;
 set master;
 do day=start to end;
  output;
 end;
 format day mmddyy10.;
 drop start end;
run;
data exclude1;
 set exclude;
 do day=start to end;
  output;
 end;
 format day mmddyy10.;
 drop start end;
run;
data temp;
 merge master1 exclude1(in=inb);
 by id day;
 if inb then delete;
run;
data temp;
 set temp;
 by id;
 if first.id or dif(day) ne 1 then group+1;
run;
data want;
 set temp;
 by group;
 retain start;
 if first.group then start=day;
 if last.group then do;end=day;output;end;
 drop day group;
 format start end mmddyy10.;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 30 Nov 2017 13:37:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417399#M102526</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2017-11-30T13:37:49Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417425#M102532</link>
      <description>&lt;P&gt;Thanks everyone for the insightful responses. As with many things SAS, there are multiple ways to accomplish any given task and the variety of solutions offered is enlightening.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Nov 2017 15:31:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417425#M102532</guid>
      <dc:creator>bstarr</dc:creator>
      <dc:date>2017-11-30T15:31:02Z</dc:date>
    </item>
    <item>
      <title>Re: Fast way to remove overlapping date spans</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417605#M102588</link>
      <description>&lt;P&gt;Hi OP et al, It's greatto notice so many different ways to accomplish the task. I tried the below approach and I really would like to learn how this can tweaked to fit to your requirement in the objective of learning only(as i'm in school). I understand you might be too busy in a production environment, however should you find time to help me learn at your own convenient time with modification of code and feedback from you and other experts, I would most appreciate it. Thank you! and good day.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; master;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end date9.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 01-01-2016 11-30-2016&lt;/P&gt;&lt;P&gt;B 01-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;C 01-01-2016 05-31-2016&lt;/P&gt;&lt;P&gt;C 07-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; exclude;&lt;/P&gt;&lt;P&gt;informat id $1. start end mmddyy10.;&lt;/P&gt;&lt;P&gt;format start end date9.;&lt;/P&gt;&lt;P&gt;input id $ start end;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;A 07-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;B 09-01-2016 09-30-2016&lt;/P&gt;&lt;P&gt;B 12-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;D 01-01-2016 12-31-2016&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt; &lt;STRONG&gt;sort&lt;/STRONG&gt; data=master;&lt;/P&gt;&lt;P&gt;by id start;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt; &lt;STRONG&gt;sort&lt;/STRONG&gt; data=exclude;&lt;/P&gt;&lt;P&gt;by id start;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;data&lt;/STRONG&gt; want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;if _N_ = &lt;STRONG&gt;1&lt;/STRONG&gt; then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;if &lt;STRONG&gt;0&lt;/STRONG&gt; then set exclude(rename=(start=ex_start end=ex_end));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dcl hash h(dataset: 'exclude(rename=(start=ex_start end=ex_end))', ordered: 'a', multidata:'y');&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; h.definekey('id');&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; h.definedata('ex_start','ex_end');&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; h.definedone();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;set master(rename=(start=m_start end=m_end));&lt;/P&gt;&lt;P&gt;rc=h.find();&lt;/P&gt;&lt;P&gt;if rc=&lt;STRONG&gt;0&lt;/STRONG&gt; then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start=m_start;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do while(rc=&lt;STRONG&gt;0&lt;/STRONG&gt;);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if m_start&amp;lt;=ex_start&amp;lt;=m_end and m_start&amp;lt;ex_end&amp;lt;=m_end then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end=ex_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start=ex_end+&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=h.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if m_start&amp;lt;=ex_start&amp;lt;=m_end and not(m_start&amp;lt;ex_end&amp;lt;=m_end) then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end=ex_start-&lt;STRONG&gt;1&lt;/STRONG&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc=h.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start=m_start;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end=m_end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;format start end mmddyy10.;&lt;/P&gt;&lt;P&gt;keep id start end;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;run&lt;/STRONG&gt;;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Nov 2017 22:45:38 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Fast-way-to-remove-overlapping-date-spans/m-p/417605#M102588</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2017-11-30T22:45:38Z</dc:date>
    </item>
  </channel>
</rss>

