<?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: Selecting correct valid-from/to dates when compressing rows in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607105#M176383</link>
    <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/33000"&gt;@EinarRoed&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can try the code below&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="09"x;
	input CUSTOMER_NR VALID_FROM_DT VALID_TO_DT MEMBER_FLG;
	informat VALID_FROM_DT VALID_TO_DT date9.;
	format VALID_FROM_DT VALID_TO_DT date9.;
	cards;
111	09AUG2013	20MAY2014	1
111	21MAY2014	22DEC2015	1
111	23DEC2015	21MAR2016	1
111	22MAR2016	27AUG2017	0
111	28AUG2017	03JAN2018	1
111	04JAN2018	08MAR2018	0
111	09MAR2019	05JUL2019	1
111	06JUL2019	31DEC9999	1
222	08APR2018	28NOV2018	0
222	29NOV2018	04MAY2019	1
222	05MAY2019	31DEC9999	1
333	03JAN2019	23OCT2019	1
333	24OCT2019	31DEC9999	0
;
run;

data have2;
	set have;
	
	where MEMBER_FLG=1;
	
	by CUSTOMER_NR;
	if first.CUSTOMER_NR then gap=0;
	
	format _lag date9.;
	_lag = lag(VALID_TO_DT);
	if VALID_FROM_DT - _lag ne 1 and first.CUSTOMER_NR=0 then gap + 1;
run;

proc sql;
	create table want as
	select CUSTOMER_NR,
		   min(VALID_FROM_DT) as VALID_FROM_DT format=date9.,
		   max(VALID_TO_DT) as VALID_TO_DT format=date9.,
		   1 as MEMBER_FLG
	from have2
	group by CUSTOMER_NR, gap;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Result:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Capture d’écran 2019-11-25 à 20.51.41.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/34229iF04DEA05E57426E8/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Capture d’écran 2019-11-25 à 20.51.41.png" alt="Capture d’écran 2019-11-25 à 20.51.41.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 25 Nov 2019 19:52:51 GMT</pubDate>
    <dc:creator>ed_sas_member</dc:creator>
    <dc:date>2019-11-25T19:52:51Z</dc:date>
    <item>
      <title>Selecting correct valid-from/to dates when compressing rows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/606890#M176311</link>
      <description>&lt;P&gt;A customer can be a member during certain intervals. I'd like to cut down on unnecesary rows and select the correct valid-from and valid-to dates.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is what I've got (including 3 example customers):&lt;/P&gt;
&lt;TABLE width="476"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="103"&gt;&lt;STRONG&gt;CUSTOMER_NR&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="129"&gt;&lt;STRONG&gt;VALID_FROM_DT&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="116"&gt;&lt;STRONG&gt;VALID_TO_DT&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="128"&gt;&lt;STRONG&gt;MEMBER_FLG&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;09AUG2013&lt;/TD&gt;
&lt;TD&gt;20MAY2014&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;21MAY2014&lt;/TD&gt;
&lt;TD&gt;22DEC2015&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;23DEC2015&lt;/TD&gt;
&lt;TD&gt;21MAR2016&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;22MAR2016&lt;/TD&gt;
&lt;TD&gt;27AUG2017&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;28AUG2017&lt;/TD&gt;
&lt;TD&gt;03JAN2018&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;04JAN2018&lt;/TD&gt;
&lt;TD&gt;08MAR2018&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;09MAR2019&lt;/TD&gt;
&lt;TD&gt;05JUL2019&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;06JUL2019&lt;/TD&gt;
&lt;TD&gt;31DEC9999&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;222&lt;/TD&gt;
&lt;TD&gt;08APR2018&lt;/TD&gt;
&lt;TD&gt;28NOV2018&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;222&lt;/TD&gt;
&lt;TD&gt;29NOV2018&lt;/TD&gt;
&lt;TD&gt;04MAY2019&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;222&lt;/TD&gt;
&lt;TD&gt;05MAY2019&lt;/TD&gt;
&lt;TD&gt;31DEC9999&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;333&lt;/TD&gt;
&lt;TD&gt;03JAN2019&lt;/TD&gt;
&lt;TD&gt;23OCT2019&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;333&lt;/TD&gt;
&lt;TD&gt;24OCT2019&lt;/TD&gt;
&lt;TD&gt;31DEC9999&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The first "membership period" for customer 111 is from 09AUG2013-21MAR2016. So I'd like to compress that to 1 row, selecting those dates. But the customer also has 2 other "membership periods", so he should have 3 output rows in total.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is what I want:&lt;/P&gt;
&lt;TABLE width="476"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="103"&gt;&lt;STRONG&gt;CUSTOMER_NR&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="129"&gt;&lt;STRONG&gt;VALID_FROM_DT&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="116"&gt;&lt;STRONG&gt;VALID_TO_DT&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="128"&gt;&lt;STRONG&gt;MEMBER_FLG&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;09AUG2013&lt;/TD&gt;
&lt;TD&gt;21MAR2016&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;28AUG2017&lt;/TD&gt;
&lt;TD&gt;03JAN2018&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;111&lt;/TD&gt;
&lt;TD&gt;09MAR2019&lt;/TD&gt;
&lt;TD&gt;31DEC9999&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;222&lt;/TD&gt;
&lt;TD&gt;29NOV2018&lt;/TD&gt;
&lt;TD&gt;31DEC9999&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;333&lt;/TD&gt;
&lt;TD&gt;03JAN2019&lt;/TD&gt;
&lt;TD&gt;23OCT2019&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'd appreciate any code suggestions. I'm having some trouble with the "membership pauses" for customer 111.&lt;/P&gt;</description>
      <pubDate>Mon, 25 Nov 2019 08:33:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/606890#M176311</guid>
      <dc:creator>EinarRoed</dc:creator>
      <dc:date>2019-11-25T08:33:54Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting correct valid-from/to dates when compressing rows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607105#M176383</link>
      <description>&lt;P&gt;Hi&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/33000"&gt;@EinarRoed&lt;/a&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can try the code below&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="09"x;
	input CUSTOMER_NR VALID_FROM_DT VALID_TO_DT MEMBER_FLG;
	informat VALID_FROM_DT VALID_TO_DT date9.;
	format VALID_FROM_DT VALID_TO_DT date9.;
	cards;
111	09AUG2013	20MAY2014	1
111	21MAY2014	22DEC2015	1
111	23DEC2015	21MAR2016	1
111	22MAR2016	27AUG2017	0
111	28AUG2017	03JAN2018	1
111	04JAN2018	08MAR2018	0
111	09MAR2019	05JUL2019	1
111	06JUL2019	31DEC9999	1
222	08APR2018	28NOV2018	0
222	29NOV2018	04MAY2019	1
222	05MAY2019	31DEC9999	1
333	03JAN2019	23OCT2019	1
333	24OCT2019	31DEC9999	0
;
run;

data have2;
	set have;
	
	where MEMBER_FLG=1;
	
	by CUSTOMER_NR;
	if first.CUSTOMER_NR then gap=0;
	
	format _lag date9.;
	_lag = lag(VALID_TO_DT);
	if VALID_FROM_DT - _lag ne 1 and first.CUSTOMER_NR=0 then gap + 1;
run;

proc sql;
	create table want as
	select CUSTOMER_NR,
		   min(VALID_FROM_DT) as VALID_FROM_DT format=date9.,
		   max(VALID_TO_DT) as VALID_TO_DT format=date9.,
		   1 as MEMBER_FLG
	from have2
	group by CUSTOMER_NR, gap;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Result:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="Capture d’écran 2019-11-25 à 20.51.41.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/34229iF04DEA05E57426E8/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Capture d’écran 2019-11-25 à 20.51.41.png" alt="Capture d’écran 2019-11-25 à 20.51.41.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 25 Nov 2019 19:52:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607105#M176383</guid>
      <dc:creator>ed_sas_member</dc:creator>
      <dc:date>2019-11-25T19:52:51Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting correct valid-from/to dates when compressing rows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607224#M176452</link>
      <description>&lt;P&gt;Worked like a charm! Thanks Ed.&lt;/P&gt;</description>
      <pubDate>Tue, 26 Nov 2019 07:33:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607224#M176452</guid>
      <dc:creator>EinarRoed</dc:creator>
      <dc:date>2019-11-26T07:33:09Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting correct valid-from/to dates when compressing rows</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607226#M176453</link>
      <description>&lt;P&gt;Sounds great!&lt;/P&gt;
&lt;P&gt;Thank you&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/33000"&gt;@EinarRoed&lt;/a&gt;&amp;nbsp;&lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Nov 2019 07:54:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-correct-valid-from-to-dates-when-compressing-rows/m-p/607226#M176453</guid>
      <dc:creator>ed_sas_member</dc:creator>
      <dc:date>2019-11-26T07:54:12Z</dc:date>
    </item>
  </channel>
</rss>

