<?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 Selecting &amp;quot;customer start date&amp;quot; based on a specific rule in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280688#M56759</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;&lt;SPAN&gt;Hello, I'd appreciate your advice on this problem.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Here's a simplified data set which displays all the policies of one customer:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;
&lt;TABLE width="530"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="84"&gt;&lt;STRONG&gt;customer_id&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="63"&gt;&lt;STRONG&gt;policy_id&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="128"&gt;&lt;STRONG&gt;policy_effective_dt&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="136"&gt;&lt;STRONG&gt;policy_expiration_dt&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="119"&gt;&lt;STRONG&gt;active_policy_flag&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;135418&lt;/TD&gt;
&lt;TD&gt;27.04.2000&lt;/TD&gt;
&lt;TD&gt;27.11.2004&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;642156&lt;/TD&gt;
&lt;TD&gt;27.11.2002&lt;/TD&gt;
&lt;TD&gt;20.10.2003&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;548874&lt;/TD&gt;
&lt;TD&gt;20.05.2011&lt;/TD&gt;
&lt;TD&gt;21.03.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;561321&lt;/TD&gt;
&lt;TD&gt;20.05.2011&lt;/TD&gt;
&lt;TD&gt;20.03.2016&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;854876&lt;/TD&gt;
&lt;TD&gt;25.04.2012&lt;/TD&gt;
&lt;TD&gt;08.04.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;231554&lt;/TD&gt;
&lt;TD&gt;12.07.2012&lt;/TD&gt;
&lt;TD&gt;03.08.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;564498&lt;/TD&gt;
&lt;TD&gt;13.08.2013&lt;/TD&gt;
&lt;TD&gt;08.05.2015&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;548879&lt;/TD&gt;
&lt;TD&gt;16.06.2016&lt;/TD&gt;
&lt;TD&gt;15.06.2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;I need to select the date in which a person became a new customer.&amp;nbsp;However there's a special rule to bear in mind, so I cannot simply use min(policy_effective_dt).&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;The rule says that if an existing customer cancels &lt;EM&gt;all&lt;/EM&gt; his policies, and signs a new policy &lt;EM&gt;over 3 months later&lt;/EM&gt;, then he should be considered a new customer. If however he signs a new policy &lt;EM&gt;within 3 months&lt;/EM&gt; (of his former policies having expired), then he's &lt;EM&gt;not&lt;/EM&gt; considered a new customer.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Based on this rule, the customer in the example data became a new customer on 20.05.2011. So that's the date I need to select. The reasons why 20.05.2011 is the correct date are:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;- The policies on the top two rows expired many years before the customer signed new policies (&lt;STRONG&gt;not&lt;/STRONG&gt; within 3 months).&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;- The only active policy has the&amp;nbsp;effective date 16.06.2016. However this is within 3 months of the former policy that was canceled (564498, 08.05.2015), and that policy's effective-date overlaps with earlier policies, with the earliest effective date being 20.05.2011.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;U&gt;&amp;nbsp;Thoughts on how to handle it so far&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;1. Select the min(policy_effective_dt) of active policies (16.06.2016)&lt;/P&gt;
&lt;P&gt;2. Establish a new variable that's loaded with the above value minus the 3 month period (16.03.2016)&lt;/P&gt;
&lt;P&gt;3. Check each row in the policy_expiration_dt column to see if any date is higher than&amp;nbsp;the variable&amp;nbsp;from step&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- If no, then 16.03.2016 is selected&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- If yes (which is the case) then select that rows policy_effective_from_dt, subtract 3 months, and restart step 3 until there's no longer any new matches.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do you have any suggestion on how to write this kind of code? I mostly just work in EG &amp;amp; DIS, so my SAS coding skills are very limited.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for your time!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 28 Jun 2016 07:50:25 GMT</pubDate>
    <dc:creator>EinarRoed</dc:creator>
    <dc:date>2016-06-28T07:50:25Z</dc:date>
    <item>
      <title>Selecting "customer start date" based on a specific rule</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280688#M56759</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;&lt;SPAN&gt;Hello, I'd appreciate your advice on this problem.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Here's a simplified data set which displays all the policies of one customer:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;
&lt;TABLE width="530"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="84"&gt;&lt;STRONG&gt;customer_id&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="63"&gt;&lt;STRONG&gt;policy_id&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="128"&gt;&lt;STRONG&gt;policy_effective_dt&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="136"&gt;&lt;STRONG&gt;policy_expiration_dt&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="119"&gt;&lt;STRONG&gt;active_policy_flag&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;135418&lt;/TD&gt;
&lt;TD&gt;27.04.2000&lt;/TD&gt;
&lt;TD&gt;27.11.2004&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;642156&lt;/TD&gt;
&lt;TD&gt;27.11.2002&lt;/TD&gt;
&lt;TD&gt;20.10.2003&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;548874&lt;/TD&gt;
&lt;TD&gt;20.05.2011&lt;/TD&gt;
&lt;TD&gt;21.03.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;561321&lt;/TD&gt;
&lt;TD&gt;20.05.2011&lt;/TD&gt;
&lt;TD&gt;20.03.2016&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;854876&lt;/TD&gt;
&lt;TD&gt;25.04.2012&lt;/TD&gt;
&lt;TD&gt;08.04.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;231554&lt;/TD&gt;
&lt;TD&gt;12.07.2012&lt;/TD&gt;
&lt;TD&gt;03.08.2013&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;564498&lt;/TD&gt;
&lt;TD&gt;13.08.2013&lt;/TD&gt;
&lt;TD&gt;08.05.2015&lt;/TD&gt;
&lt;TD&gt;0&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;127055&lt;/TD&gt;
&lt;TD&gt;548879&lt;/TD&gt;
&lt;TD&gt;16.06.2016&lt;/TD&gt;
&lt;TD&gt;15.06.2017&lt;/TD&gt;
&lt;TD&gt;1&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;I need to select the date in which a person became a new customer.&amp;nbsp;However there's a special rule to bear in mind, so I cannot simply use min(policy_effective_dt).&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;The rule says that if an existing customer cancels &lt;EM&gt;all&lt;/EM&gt; his policies, and signs a new policy &lt;EM&gt;over 3 months later&lt;/EM&gt;, then he should be considered a new customer. If however he signs a new policy &lt;EM&gt;within 3 months&lt;/EM&gt; (of his former policies having expired), then he's &lt;EM&gt;not&lt;/EM&gt; considered a new customer.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Based on this rule, the customer in the example data became a new customer on 20.05.2011. So that's the date I need to select. The reasons why 20.05.2011 is the correct date are:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;- The policies on the top two rows expired many years before the customer signed new policies (&lt;STRONG&gt;not&lt;/STRONG&gt; within 3 months).&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;- The only active policy has the&amp;nbsp;effective date 16.06.2016. However this is within 3 months of the former policy that was canceled (564498, 08.05.2015), and that policy's effective-date overlaps with earlier policies, with the earliest effective date being 20.05.2011.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;U&gt;&amp;nbsp;Thoughts on how to handle it so far&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;1. Select the min(policy_effective_dt) of active policies (16.06.2016)&lt;/P&gt;
&lt;P&gt;2. Establish a new variable that's loaded with the above value minus the 3 month period (16.03.2016)&lt;/P&gt;
&lt;P&gt;3. Check each row in the policy_expiration_dt column to see if any date is higher than&amp;nbsp;the variable&amp;nbsp;from step&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- If no, then 16.03.2016 is selected&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- If yes (which is the case) then select that rows policy_effective_from_dt, subtract 3 months, and restart step 3 until there's no longer any new matches.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Do you have any suggestion on how to write this kind of code? I mostly just work in EG &amp;amp; DIS, so my SAS coding skills are very limited.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks for your time!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jun 2016 07:50:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280688#M56759</guid>
      <dc:creator>EinarRoed</dc:creator>
      <dc:date>2016-06-28T07:50:25Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting "customer start date" based on a specific rule</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280692#M56761</link>
      <description>&lt;P&gt;Try this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input
  customer_id
  policy_id
  policy_effective_dt :ddmmyy10.
  policy_expiration_dt :ddmmyy10.
  active_policy_flag
;
format 
  policy_effective_dt
  policy_expiration_dt
    ddmmyyp10.
;
cards;
127055 135418 27.04.2000 27.11.2004 0
127055 642156 27.11.2002 20.10.2003 0
127055 548874 20.05.2011 21.03.2013 0
127055 561321 20.05.2011 20.03.2016 0
127055 854876 25.04.2012 08.04.2013 0
127055 231554 12.07.2012 03.08.2013 0
127055 564498 13.08.2013 08.05.2015 0
127055 548879 16.06.2016 15.06.2017 1
;
run;

proc sort data=have;
by customer_id policy_effective_dt;
run;

data ranges (keep=customer_id range_start range_end);
set have;
by customer_id;
retain range_start range_end;
format range_start range_end ddmmyyp10.;
if first.customer_id
then do;
  range_start = policy_effective_dt;
  range_end = policy_expiration_dt;
end;
else do;
  if policy_effective_dt &amp;lt;= intnx('month',range_end,3)
  then do;
    range_end = max(policy_expiration_dt,range_end);
    if last.customer_id then output;
  end;
  else do;
    output;
    range_start = policy_effective_dt;
    range_end = policy_expiration_dt;
  end;
end;
run;

data want;
merge
  have (in=a)
  ranges (
    in=b
    keep=customer_id range_start
    rename=(range_start=policy_effective_dt)
  )
;
by customer_id policy_effective_dt;
if a;
if b
then new_customer = 1;
else new_customer = 0;
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 28 Jun 2016 08:55:33 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280692#M56761</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2016-06-28T08:55:33Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting "customer start date" based on a specific rule</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280693#M56762</link>
      <description>&lt;P&gt;OK. If I know what you are talking about .&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 have;
infile cards expandtabs truncover;
input customer_id	policy_id	policy_effective_dt : ddmmyy10.	policy_expiration_dt : ddmmyy10.;
format policy_effective_dt policy_expiration_dt ddmmyyp10.;
cards;
127055	135418	27.04.2000	27.11.2004	0
127055	642156	27.11.2002	20.10.2003	0
127055	548874	20.05.2011	21.03.2013	0
127055	561321	20.05.2011	20.03.2016	0
127055	854876	25.04.2012	08.04.2013	0
127055	231554	12.07.2012	03.08.2013	0
127055	564498	13.08.2013	08.05.2015	0
127055	548879	16.06.2016	15.06.2017
;
run;
data want;
array x{9999} _temporary_;

 do i=1 by 1 until(last.customer_id);
  set have;
  by customer_id;
  x{i}=policy_expiration_dt;
 end;
max_date=.; 
 do j=1 by 1 until(last.customer_id);
  set have;
  by customer_id;
  new_customer=0;
  if intck('month',max_date,policy_effective_dt,'c') gt 3 then new_customer=1;
  max_date=max(max_date,x{j}); 
  output;
 end;
 
drop i j  max_date;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 28 Jun 2016 09:04:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280693#M56762</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-06-28T09:04:12Z</dc:date>
    </item>
    <item>
      <title>Re: Selecting "customer start date" based on a specific rule</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280787#M56803</link>
      <description>&lt;P&gt;Thank you very much,&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp﻿&lt;/a&gt;&amp;nbsp;&amp;amp;&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/11562"&gt;@Kurt_Bremser﻿&lt;/a&gt;. I'm in the process of testing the logic for a much larger dataset, and it's looking very good so far. &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jun 2016 13:59:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Selecting-quot-customer-start-date-quot-based-on-a-specific-rule/m-p/280787#M56803</guid>
      <dc:creator>EinarRoed</dc:creator>
      <dc:date>2016-06-28T13:59:43Z</dc:date>
    </item>
  </channel>
</rss>

