<?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: Construct continuous intervals from non-contiguous validity ranges in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805911#M317485</link>
    <description>&lt;P&gt;For each ID, you want to construct a set of non-overlapping date ranges, that preserve all the attribute information history that came from a set of overlapping ranges.&amp;nbsp;&amp;nbsp;Is that correct?&lt;/P&gt;</description>
    <pubDate>Mon, 04 Apr 2022 18:54:39 GMT</pubDate>
    <dc:creator>mkeintz</dc:creator>
    <dc:date>2022-04-04T18:54:39Z</dc:date>
    <item>
      <title>Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805843#M317450</link>
      <description>&lt;P&gt;&lt;SPAN&gt;Given&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data have;
    infile datalines missover delimiter="|" dsd;
    input id :$20. (start_date end_date) (:date9.) (attribute_1 attribute_2 attribute_3 attribute_4) ($);
    format start_date end_date date9.;
    datalines;&lt;BR /&gt;ID1|01MAR2014|31DEC9999|BIG|YES|| 
ID2|01SEP2015|30NOV2020|||TWO|
ID2|01SEP2015|31DEC9999|SMALL|||
ID2|01AUG2021|31DEC9999|||TWO|
ID3|01DEC2014|31MAY2016||YES||
ID3|01DEC2014|29JUN2017||||OK
ID3|01DEC2014|31DEC9999|MEDIUM|||
ID3|31MAR2015|29SEP2017|||ONE|
ID3|30JUN2017|31DEC9999||YES||TBD
ID3|30SEP2017|31DEC9999|||ONE, TWO|
;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I would like to get continuous validity ranges for each id with the correct attributes at each of them.&lt;BR /&gt;The desired output would be like this:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;+-----+------------+-----------+-------------+-------------+-------------+-------------+
| id  | start_date | end_date  | attribute_1 | attribute_2 | attribute_3 | attribute_4 |
+-----+------------+-----------+-------------+-------------+-------------+-------------+
| ID1 | 01MAR2014  | 31DEC9999 | BIG         | YES         |             |             |
| ID2 | 01SEP2015  | 30NOV2020 | SMALL       |             | TWO         |             |
| ID2 | 01DEC2020  | 31JUL2021 | SMALL       |             |             |             |
| ID2 | 01AUG2021  | 31DEC9999 | SMALL       |             | TWO         |             |
| ID3 | 01DEC2014  | 30MAR2015 | MEDIUM      | YES         |             | OK          |
| ID3 | 31MAR2015  | 31MAY2016 | MEDIUM      | YES         | ONE         | OK          |
| ID3 | 01JUN2016  | 29JUN2016 | MEDIUM      |             | ONE         | OK          |
| ID3 | 30JUN2016  | 29SEP2017 | MEDIUM      | YES         | ONE         | TBD         |
| ID3 | 30SEP2017  | 31DEC9999 | MEDIUM      | YES         | ONE, TWO    | TBD         |
+-----+------------+-----------+-------------+-------------+-------------+-------------+&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;I found a way of doing it using joins, but would like to know if there exist a better way of doing the following:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=""&gt;data all_intervals;
    set have(keep= id start_date end_date);
    _start = start_date; output;
    _end = start_date-1; output;
    _end = end_date; output;
    if end_date &amp;lt; '31DEC9999'd then do;
        _start = end_date+1; output;
    end;
run;

proc sql;
    create table all_intervals as
    select distinct t1.id, t1._start, t2._end
    from all_intervals t1, all_intervals t2
    where t1.id = t2.id and t2._end &amp;gt; t1._start
;
quit;

data all_intervals;
set all_intervals;
by id _start;
if first.id or first._start;
run;

proc sql noprint;
    select 'max(t1.'||NAME||') as '||NAME into :attributes separated by ','
    from sashelp.vcolumn
    where libname = "WORK" and memname = "HAVE" and upcase(name) not in ('ID', "_START", "_END")
;
quit;

proc sql;
    create table merge as
    select t2.id, t2._start as start_date, t2._end as end_date, &amp;amp;attributes.
    from have t1 right join all_intervals t2
    on t1.id = t2.id
    and ((t2._start &amp;lt;= t1.start_date &amp;lt;= t2._end)
        or (t2._start &amp;lt;= t1.end_date &amp;lt;=  t2._end)
        or (t2._start &amp;gt;= t1.start_date and t2._end &amp;lt;= t1.end_date))
    group by t2.id, t2._start
    order by t2.id, t2._start
;
quit;

proc sort data=merge out=want nodupkey; by id start_date end_date; run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;The above produce the expected output.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 04 Apr 2022 16:03:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805843#M317450</guid>
      <dc:creator>legends1337</dc:creator>
      <dc:date>2022-04-04T16:03:24Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805872#M317463</link>
      <description>&lt;P&gt;It would help if you stated some rules so that we don't have to decipher to code to determine what the rules you have implemented might actually be.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A minor point: You want to be cautious with DATALINES data that does not start on the left margin. Every so often you can make a logic error in the input and have odd results.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This works for your example data. Assumption is that there is ONLY one value populated for the Attribute_1 variable per group. If that is not the case then you need to provide data that shows the behavior with multiple values and what the actual result for that example would be.&lt;/P&gt;
&lt;PRE&gt;
data example;
   merge have have(keep = id attribute_1  rename=(attribute_1=attr1)
                   where= (not missing(attr1))
                  )
  ;
  by id;
  attribute_1 = coalescec(attribute_1,attr1);
  drop attr1;

run;

&lt;/PRE&gt;
&lt;P&gt;This relies on the default behavior of Merge. A similar one step left join in SQL, left to the interested reader, joining the data set on itself on the ID variable and only using the Attribute_1 variable from a reflex join.&lt;/P&gt;</description>
      <pubDate>Mon, 04 Apr 2022 15:18:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805872#M317463</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2022-04-04T15:18:52Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805880#M317468</link>
      <description>&lt;P&gt;Thank you for the swift reply&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/13884"&gt;@ballardw&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Sorry if I was not clear enough.&lt;/P&gt;&lt;P&gt;Basically, the idea is that I have multiple records with different validity ranges for each ID. In each of those observations, some attributes are populated (at least one). The problem is that the validity ranges are not continuous.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;U&gt;Example:&lt;/U&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;+-----+------------+-----------+-------------+-------------+-------------+-------------+
| id  | start_date | end_date  | attribute_1 | attribute_2 | attribute_3 | attribute_4 |
+-----+------------+-----------+-------------+-------------+-------------+-------------+
| ID2 | 01SEP2015  | 30NOV2020 |             |             | TWO         |             | -----&amp;gt; Attribute 3 is valid from 01SEP2015 to 30NOV2020
| ID2 | 01DEC2020  | 31JUL2021 | SMALL       |             |             |             | -----&amp;gt; Attribute 1 is valid from 01SEP2015 to 31DEC9999&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I would like to end up with is a table that contains the "status" (meaning: what are the attributes values) of an ID at one point in time (from 01JAN2014 to 31DEC9999). So instead of overlapping dates, I would have continuous validity ranges:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;+-----+------------+-----------+-------------+-------------+-------------+-------------+
| id  | start_date | end_date  | attribute_1 | attribute_2 | attribute_3 | attribute_4 |
+-----+------------+-----------+-------------+-------------+-------------+-------------+
| ID2 | 01SEP2015  | 30NOV2020 | SMALL       |             | TWO         |             | ----&amp;gt; until 30NOV2020
| ID2 | 01DEC2020  | 31JUL2021 | SMALL       |             |             |             | ----&amp;gt; Start 30NOV2020 + 1 day
| ID2 | 01AUG2021  | 31DEC9999 | SMALL       |             | TWO         |             | ----&amp;gt; Start 31JUL2021 + 1 day
+-----+------------+-----------+-------------+-------------+-------------+-------------+&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Having this table as output will help me when I am trying to find the exact status of an ID at a given point in time (it will output only a single observation).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;U&gt;Example:&lt;/U&gt;&lt;/P&gt;&lt;P&gt;where &lt;STRONG&gt;id="ID2" and start_date &amp;lt;= "28SEP2020"d &amp;lt;= end_date&lt;/STRONG&gt; should only output one observation which is:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;+-----+------------+-----------+-------------+-------------+-------------+-------------+
| id  | start_date | end_date  | attribute_1 | attribute_2 | attribute_3 | attribute_4 |
+-----+------------+-----------+-------------+-------------+-------------+-------------+
| ID2 | 01SEP2015  | 30NOV2020 | SMALL       |             | TWO         |             |
+-----+------------+-----------+-------------+-------------+-------------+-------------+&lt;/CODE&gt;&lt;CODE&gt;&lt;BR /&gt;&lt;/CODE&gt;&lt;CODE class=""&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;CODE&gt;----&amp;gt; Attribute_1 = "SMALL" and attribute_3 = "TWO" at that specific time.&lt;/CODE&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;instead of&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;+-----+------------+-----------+-------------+-------------+-------------+-------------+
| id  | start_date | end_date  | attribute_1 | attribute_2 | attribute_3 | attribute_4 |
+-----+------------+-----------+-------------+-------------+-------------+-------------+
| ID2 | 01SEP2015  | 30NOV2020 |             |             | TWO         |             |
| ID2 | 01SEP2015  | 31DEC9999 | SMALL       |             |             |             |
+-----+------------+-----------+-------------+-------------+-------------+-------------+&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Also, your code does not produce the expected output for the example: the validity ranges are not continuous (they remain unchanged)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;+-----+-------------+-----------+--------------+--------------+--------------+--------------+
| id  |  start_date |  end_date |  attribute_1 |  attribute_2 |  attribute_3 |  attribute_4 |
+-----+-------------+-----------+--------------+--------------+--------------+--------------+
| ID1 | 01MAR2014   | 31DEC9999 | BIG          | YES          |              |              |
| ID2 | 01SEP2015   | 30NOV2020 | SMALL        |              | TWO          |              |
| ID2 | 01SEP2015   | 31DEC9999 | SMALL        |              |              |              |
| ID2 | 01AUG2021   | 31DEC9999 | SMALL        |              | TWO          |              |
| ID3 | 01DEC2014   | 31MAY2016 | MEDIUM       | YES          |              |              |
| ID3 | 01DEC2014   | 29JUN2017 | MEDIUM       |              |              | OK           |
| ID3 | 01DEC2014   | 31DEC9999 | MEDIUM       |              |              |              |
| ID3 | 31MAR2015   | 29SEP2017 | MEDIUM       |              | ONE          |              |
| ID3 | 30JUN2017   | 31DEC9999 | MEDIUM       | YES          |              | TBD          |
| ID3 | 30SEP2017   | 31DEC9999 | MEDIUM       |              | ONE, TWO     |              |
+-----+-------------+-----------+--------------+--------------+--------------+--------------+&lt;/PRE&gt;&lt;P&gt;Please let me know if that is still unclear.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 04 Apr 2022 16:07:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805880#M317468</guid>
      <dc:creator>legends1337</dc:creator>
      <dc:date>2022-04-04T16:07:15Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805911#M317485</link>
      <description>&lt;P&gt;For each ID, you want to construct a set of non-overlapping date ranges, that preserve all the attribute information history that came from a set of overlapping ranges.&amp;nbsp;&amp;nbsp;Is that correct?&lt;/P&gt;</description>
      <pubDate>Mon, 04 Apr 2022 18:54:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805911#M317485</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2022-04-04T18:54:39Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805913#M317486</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461"&gt;@mkeintz&lt;/a&gt;&amp;nbsp;Correct - this is exactly what I am searching for.&lt;/P&gt;</description>
      <pubDate>Mon, 04 Apr 2022 19:02:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805913#M317486</guid>
      <dc:creator>legends1337</dc:creator>
      <dc:date>2022-04-04T19:02:09Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805926#M317493</link>
      <description>&lt;P&gt;You could just brute force it.&lt;/P&gt;
&lt;P&gt;Expand each observation into one row per date.&amp;nbsp; Use UPDATE statement to collapse the away the missing values.&amp;nbsp; Then use BY group processing to find the new intervals.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
    infile datalines truncover dlm="|" dsd;
    input id :$20. (start_date end_date) (:date9.) (attribute_1 - attribute_4) ($);
    format start_date end_date date9.;
datalines;
ID1|01MAR2014|31DEC9999|BIG|YES||
ID2|01SEP2015|30NOV2020|||TWO|
ID2|01SEP2015|31DEC9999|SMALL|||
ID2|01AUG2021|31DEC9999|||TWO|
ID3|01DEC2014|31MAY2016||YES||
ID3|01DEC2014|29JUN2017||||OK
ID3|01DEC2014|31DEC9999|MEDIUM|||
ID3|31MAR2015|29SEP2017|||ONE|
ID3|30JUN2017|31DEC9999||YES||TBD
ID3|30SEP2017|31DEC9999|||ONE, TWO|
;

data step1;
  set have;
  do date=start_date to end_date;
    output;
  end;
  format date date9.;
  drop start_date end_date;
run;

proc sort; by id date; run;

data step2;
  update step1(obs=0) step1;
  by id date;
run;

data want;
  retain id start_date date;
  set step2;
  by id attribute_1 - attribute_4 notsorted;
  if first.attribute_4 then start_date=date;
  if last.attribute_4;
  rename date=end_date;
  format start_date date9.;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Results&lt;/P&gt;
&lt;PRE&gt;                 start_                 attribute_    attribute_    attribute_    attribute_
Obs    id          date     end_date        1             2             3             4

 1     ID1    01MAR2014    31DEC9999      BIG            YES
 2     ID2    01SEP2015    30NOV2020      SMALL                      TWO
 3     ID2    01DEC2020    31JUL2021      SMALL
 4     ID2    01AUG2021    31DEC9999      SMALL                      TWO
 5     ID3    01DEC2014    30MAR2015      MEDIUM         YES                         OK
 6     ID3    31MAR2015    31MAY2016      MEDIUM         YES         ONE             OK
 7     ID3    01JUN2016    29JUN2017      MEDIUM                     ONE             OK
 8     ID3    30JUN2017    29SEP2017      MEDIUM         YES         ONE             TBD
 9     ID3    30SEP2017    31DEC9999      MEDIUM         YES         ONE, TWO        TBD
&amp;#12;
&lt;/PRE&gt;
&lt;P&gt;Your expected output does not look right for the ID3.&lt;/P&gt;
&lt;PRE&gt;Value Comparison Results for Variables

______________________________________________________________________
                       ||       Base    Compare
 id                    ||  start_dat  start_dat      Diff.     % Diff
                       ||          e          e
 ____________________  ||  _________  _________  _________  _________
                       ||
 ID3                   ||  30JUN2017  30JUN2016  -365.0000    -1.7381
______________________________________________________________________


______________________________________________________________________
                       ||       Base    Compare
 id                    ||   end_date   end_date      Diff.     % Diff
 ____________________  ||  _________  _________  _________  _________
                       ||
 ID3                   ||  29JUN2017  29JUN2016  -365.0000    -1.7382
______________________________________________________________________

&lt;/PRE&gt;</description>
      <pubDate>Mon, 04 Apr 2022 20:01:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/805926#M317493</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2022-04-04T20:01:25Z</dc:date>
    </item>
    <item>
      <title>Re: Construct continuous intervals from non-contiguous validity ranges</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/806035#M317532</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
    infile datalines truncover dlm="|" dsd;
    input id :$20. (start_date end_date) (:date9.) (attribute_1 - attribute_4) ($);
    format start_date end_date date9.;
datalines;
ID1|01MAR2014|31DEC9999|BIG|YES||
ID2|01SEP2015|30NOV2020|||TWO|
ID2|01SEP2015|31DEC9999|SMALL|||
ID2|01AUG2021|31DEC9999|||TWO|
ID3|01DEC2014|31MAY2016||YES||
ID3|01DEC2014|29JUN2017||||OK
ID3|01DEC2014|31DEC9999|MEDIUM|||
ID3|31MAR2015|29SEP2017|||ONE|
ID3|30JUN2017|31DEC9999||YES||TBD
ID3|30SEP2017|31DEC9999|||ONE, TWO|
;

data step1;
  set have;
  length attrib $ 80;
  attrib=catx('|',of attribute_1-attribute_4);
  do date=start_date to end_date;
    output;
  end;
  format date date9.;
  drop start_date end_date attribute_1 - attribute_4;
run;

proc sort data=step1; by id date; run;

data step2;
  n=0;
 do until(last.date);
  set step1;
  by id date ;
  array x{20} $ 20  ;
  length unique $ 200;
  do i=1 to countw(attrib,'|');
    temp=scan(attrib,i,'|');
	if temp not in x then do;n+1;x{n}=temp;end;
  end;
 end;
 call sortc(of x{i});
 unique=catx("|",of x{*});
 drop i temp attrib x: n;
 run;

data step3;
 do until(last.unique);
  set step2;
  by id unique notsorted;
  if first.unique then start=date;
end;
end=date;
drop date;
format start end date9.;
 run;

 data step4;
 if _n_=1 then do;
  if 0 then set have;
  declare hash h1(dataset:'have(keep=attribute_1 where=(attribute_1 is not missing))');
  h1.definekey('attribute_1');
  h1.definedone();

  declare hash h2(dataset:'have(keep=attribute_2 where=(attribute_2 is not missing))');
  h2.definekey('attribute_2');
  h2.definedone();

  declare hash h3(dataset:'have(keep=attribute_3 where=(attribute_3 is not missing))');
  h3.definekey('attribute_3');
  h3.definedone();

  declare hash h4(dataset:'have(keep=attribute_4 where=(attribute_4 is not missing))');
  h4.definekey('attribute_4');
  h4.definedone();
 end;
  set step3;
  length key $ 20;
  do i=1 to countw(unique,'|');
   key=scan(unique,i,'|');
   if h1.check(key:key)=0 then n=1;
   if h2.check(key:key)=0 then n=2;
   if h3.check(key:key)=0 then n=3;
   if h4.check(key:key)=0 then n=4;
   output;
  end;
drop unique i start_date end_date attribute_:;
run;

proc transpose data=step4 out=want(drop=_name_) prefix=attribute_;
by id start end;
var key;
id n;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ksharp_0-1649160539801.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/70123i2142DD786FF31239/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Ksharp_0-1649160539801.png" alt="Ksharp_0-1649160539801.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 05 Apr 2022 12:09:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Construct-continuous-intervals-from-non-contiguous-validity/m-p/806035#M317532</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2022-04-05T12:09:07Z</dc:date>
    </item>
  </channel>
</rss>

