<?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: Rolling 12 months with distinct customer count in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700100#M214225</link>
    <description>&lt;P&gt;I all you are doing is getting rolling 12 months counts of unique customers by brand/country, then:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=orders out=need nodupkey;
	by brand country monthyear custid;
run;

%let minyear=2016;  ** One less than actual earliest year **;
%let maxyear=2020;

data counts (keep=brand country monthyear value rolling12);

  set need;
  by brand country monthyear;

  array vals{&amp;amp;minyear:&amp;amp;maxyear,1:12} _temporary_ ; 

  if first.country then call missing(of vals{*},value,rolling12);

  if first.monthyear then value=0;
  value+1;            

  if last.monthyear;
  y=year(monthyear);
  m=month(monthyear);
  vals{y,m}=value;
  rolling12+value ;
  if vals{y-1,m}&amp;gt;0 then rolling12=rolling12-vals{y-1,m};

run;

&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;This keeps a two dimensional (rows are years, months are columns) array of customer counts.&amp;nbsp; Counting customers within each brand/countery/monthyear is easy.&amp;nbsp; Then, at the last record of each monthyear, update the array with the new value.&amp;nbsp; And update the rolling12 by adding VALUE to it, and subtracting the value from 12 months prior.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Set the macrovar MINYEAR to 1 less than the earliest year in your data.&amp;nbsp; &amp;nbsp;MINYEAR identifies the first row in the array, so it becomes a valid (though unused) row identity when referring to 12 months prior to the first actual monthyear.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note that while any starting and ending monthyear can be accomodated in this program, it assumes there are no missing &lt;EM&gt;&lt;STRONG&gt;internal&lt;/STRONG&gt;&lt;/EM&gt; months for any brand/country combination.&amp;nbsp; However, a few extra lines of code could accommodate that situation.&lt;/P&gt;</description>
    <pubDate>Thu, 19 Nov 2020 05:42:11 GMT</pubDate>
    <dc:creator>mkeintz</dc:creator>
    <dc:date>2020-11-19T05:42:11Z</dc:date>
    <item>
      <title>Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699950#M214144</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hi, I've look at at least 12 similar posts with out getting it right. I hope someone can solve this one!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The below code is a preparation for a rolling 12 months total active customer count, that keeps rolling over they years. What code should I use to continue and get:&lt;/P&gt;
&lt;P&gt;* IMPORTANT: For each 12 months period, the same cust_id can only be counted once.&lt;/P&gt;
&lt;P&gt;* I want as the table below (but with the above statement in mind)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&amp;nbsp;&lt;/PRE&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data orders;
set 	order_info;
keep brand cust_id country monthyear value;
monthyear = intnx('month',t_dat,0,"BEGINNING");
   format monthyear date9.;
value=1;
run;

proc sort data=orders nodupkey;
	by brand country cust_id monthyear;
run;

data customers;
	set customer_info;
	keep brand cust_id email country;
	run;
	
proc sort data=customers nodupkey;
by brand email cust_id country;
run;

data merge_orders_customers;
merge orders (in=a) customers (in=b);
by brand cust_id country;
if a and b;
run;

proc sort data=merge_orders_customers;
  by brand email country descending monthyear;
run;

proc sort data=merge_orders_customers nodupkey;
  by brand email country;
run;

proc means data=merge_orders_customers noprint;
output out = total sum=;
by brand country monthyear;
run;&lt;BR /&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;TABLE style="width: 375px;" width="375px"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;STRONG&gt;&lt;FONT size="2"&gt;Brand&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;STRONG&gt;&lt;FONT size="2"&gt;Country&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;STRONG&gt;&lt;FONT size="2"&gt;monthyear&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;STRONG&gt;&lt;FONT size="2"&gt;value&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;STRONG&gt;&lt;FONT size="2"&gt;rolling12&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-dec-17&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;4337&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;4337&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jan-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;3995&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;8332&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-feb-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;1953&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;10285&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-mar-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;2961&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;13246&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-apr-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;2728&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;15974&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-maj-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;3586&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;19560&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jun-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;5167&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;24727&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jul-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;4676&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;29403&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-aug-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;3610&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;33013&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-sep-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;4545&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;37558&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-okt-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;6114&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;43672&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-nov-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;6403&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;50075&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-dec-18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;10531&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;56269&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jan-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;7655&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;59929&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-feb-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;5435&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;63411&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-mar-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;8170&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;68620&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-apr-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;7786&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;73678&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-maj-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;8205&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;78297&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jun-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;12129&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;85259&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jul-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;11270&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;91853&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-aug-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;8494&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;96737&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-sep-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;10344&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;102536&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-okt-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;21546&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;117968&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-nov-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;14789&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;126354&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-dec-19&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;26496&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;142319&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jan-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;20308&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;154972&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-feb-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;14091&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;163628&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-mar-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;22798&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;178256&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-apr-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;33769&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;204239&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-maj-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;34623&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;230657&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jun-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;41845&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;260373&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-jul-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;35616&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;284719&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-aug-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;30437&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;306662&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-sep-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;52758&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;349076&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;BrandA&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="83px"&gt;&lt;FONT size="2"&gt;GB&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="90px"&gt;&lt;FONT size="2"&gt;01-okt-20&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="67px"&gt;&lt;FONT size="2"&gt;72768&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD width="68px"&gt;&lt;FONT size="2"&gt;400298&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="67px"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="83px"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="90px"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="67px"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD width="68px"&gt;&amp;nbsp;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 18 Nov 2020 20:41:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699950#M214144</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-18T20:41:25Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699985#M214162</link>
      <description>I have attached sample data.</description>
      <pubDate>Wed, 18 Nov 2020 20:42:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699985#M214162</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-18T20:42:14Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699988#M214164</link>
      <description>&lt;P&gt;So is this your raw data? What does Value represent? You talk about distinct counts of Cust_IDs, but I do not see any?&lt;/P&gt;</description>
      <pubDate>Wed, 18 Nov 2020 20:53:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/699988#M214164</guid>
      <dc:creator>PeterClemmensen</dc:creator>
      <dc:date>2020-11-18T20:53:13Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700068#M214212</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/230778"&gt;@SURIM&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;I have attached sample data.&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;But where is the starting data?&amp;nbsp; I.e. the ORDERS dataset?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;And just to be clear - For each brand/country combination, I think you want the number of &lt;EM&gt;&lt;STRONG&gt;unique&lt;/STRONG&gt;&lt;/EM&gt; customer id's for each 12-month period, correct?&amp;nbsp; And you presumably want it for every twelve month period completely contained in your data.&amp;nbsp; Is that right?&lt;/P&gt;</description>
      <pubDate>Thu, 19 Nov 2020 02:04:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700068#M214212</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2020-11-19T02:04:02Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700100#M214225</link>
      <description>&lt;P&gt;I all you are doing is getting rolling 12 months counts of unique customers by brand/country, then:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sort data=orders out=need nodupkey;
	by brand country monthyear custid;
run;

%let minyear=2016;  ** One less than actual earliest year **;
%let maxyear=2020;

data counts (keep=brand country monthyear value rolling12);

  set need;
  by brand country monthyear;

  array vals{&amp;amp;minyear:&amp;amp;maxyear,1:12} _temporary_ ; 

  if first.country then call missing(of vals{*},value,rolling12);

  if first.monthyear then value=0;
  value+1;            

  if last.monthyear;
  y=year(monthyear);
  m=month(monthyear);
  vals{y,m}=value;
  rolling12+value ;
  if vals{y-1,m}&amp;gt;0 then rolling12=rolling12-vals{y-1,m};

run;

&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;This keeps a two dimensional (rows are years, months are columns) array of customer counts.&amp;nbsp; Counting customers within each brand/countery/monthyear is easy.&amp;nbsp; Then, at the last record of each monthyear, update the array with the new value.&amp;nbsp; And update the rolling12 by adding VALUE to it, and subtracting the value from 12 months prior.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Set the macrovar MINYEAR to 1 less than the earliest year in your data.&amp;nbsp; &amp;nbsp;MINYEAR identifies the first row in the array, so it becomes a valid (though unused) row identity when referring to 12 months prior to the first actual monthyear.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note that while any starting and ending monthyear can be accomodated in this program, it assumes there are no missing &lt;EM&gt;&lt;STRONG&gt;internal&lt;/STRONG&gt;&lt;/EM&gt; months for any brand/country combination.&amp;nbsp; However, a few extra lines of code could accommodate that situation.&lt;/P&gt;</description>
      <pubDate>Thu, 19 Nov 2020 05:42:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700100#M214225</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2020-11-19T05:42:11Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700129#M214241</link>
      <description>The value is the count of unique customers by brand, country, monthyear. Sorry this wasn’t clear.&lt;BR /&gt;Is there something else I can attach to make it better?&lt;BR /&gt;</description>
      <pubDate>Thu, 19 Nov 2020 07:30:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700129#M214241</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-19T07:30:39Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700130#M214242</link>
      <description>Yes orders and customers are merged to get the email variable, since that is only in the customers table, but I need all of the orders to be able to count a 12month period every month. I honestly thought it would be easier to figure out a solution, but have tried writing the code in 50 different ways… Thanks for helping out.&lt;BR /&gt;</description>
      <pubDate>Thu, 19 Nov 2020 07:32:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700130#M214242</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-19T07:32:39Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700235#M214279</link>
      <description>&lt;P&gt;So, when I run this code the "need" table looks good and reasonable.&lt;/P&gt;
&lt;PRE&gt;Brand	Country	monthyear	value
BrandA	SE	01-jan-19	2498
BrandA	SE	01-feb-19	2590
BrandA	SE	01-mar-19	3315
BrandA	SE	01-apr-19	3787
BrandA	SE	01-maj-19	4523
BrandA	SE	01-jun-19	4588
BrandA	SE	01-jul-19	4222
BrandA	SE	01-aug-19	4897
BrandA	SE	01-sep-19	4834
BrandA	SE	01-okt-19	5231
BrandA	SE	01-nov-19	4595
BrandA	SE	01-dec-19	5826
BrandA	SE	01-jan-20	5180
BrandA	SE	01-feb-20	5812
BrandA	SE	01-mar-20	6940
BrandA	SE	01-apr-20	9144
BrandA	SE	01-maj-20	11496
BrandA	SE	01-jun-20	14483
BrandA	SE	01-jul-20	11671
BrandA	SE	01-aug-20	16985
BrandA	SE	01-sep-20	19664
BrandA	SE	01-okt-20	17903
&lt;/PRE&gt;
&lt;P&gt;But something gets wrong when it comes to the "counts" table&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;Brand	Country	monthyear	value	rolling12
BrandA	SE	01-dec-17	1	1
BrandA	SE	01-jan-18	1	2
BrandA	SE	01-feb-18	1	3
BrandA	SE	01-mar-18	1	4
BrandA	SE	01-apr-18	1	5
BrandA	SE	01-maj-18	1	6
BrandA	SE	01-jun-18	1	7
BrandA	SE	01-jul-18	1	8
BrandA	SE	01-aug-18	1	9
BrandA	SE	01-sep-18	1	10
BrandA	SE	01-okt-18	1	11
BrandA	SE	01-nov-18	1	12
BrandA	SE	01-dec-18	1	12
BrandA	SE	01-jan-19	1	12
BrandA	SE	01-feb-19	1	12
BrandA	SE	01-mar-19	1	12
BrandA	SE	01-apr-19	1	12
BrandA	SE	01-maj-19	1	12
BrandA	SE	01-jun-19	1	12
BrandA	SE	01-jul-19	1	12
BrandA	SE	01-aug-19	1	12
BrandA	SE	01-sep-19	1	12
BrandA	SE	01-okt-19	1	12
BrandA	SE	01-nov-19	1	12
BrandA	SE	01-dec-19	1	12
BrandA	SE	01-jan-20	1	12
BrandA	SE	01-feb-20	1	12
BrandA	SE	01-mar-20	1	12
BrandA	SE	01-apr-20	1	12
BrandA	SE	01-maj-20	1	12
BrandA	SE	01-jun-20	1	12
BrandA	SE	01-jul-20	1	12
BrandA	SE	01-aug-20	1	12
BrandA	SE	01-sep-20	1	12
BrandA	SE	01-okt-20	1	12
&lt;/PRE&gt;</description>
      <pubDate>Thu, 19 Nov 2020 15:58:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/700235#M214279</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-19T15:58:23Z</dc:date>
    </item>
    <item>
      <title>Re: Rolling 12 months with distinct customer count</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/701773#M214915</link>
      <description>&lt;P&gt;I kept trying with the suggested code and other codes and manage to get as close as I will get.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data need;&lt;BR /&gt;set have;&lt;BR /&gt;by brand country;&lt;BR /&gt;array win{0:11} _temporary_;&lt;/P&gt;
&lt;P&gt;if first.monthyear&lt;BR /&gt;then do;&lt;BR /&gt;call missing(of win{*});&lt;BR /&gt;count = 0;&lt;BR /&gt;end;&lt;BR /&gt;if first.country_&lt;BR /&gt;then do;&lt;BR /&gt;call missing(of win{*});&lt;BR /&gt;count = 0;&lt;BR /&gt;end;&lt;BR /&gt;else count + 1;&lt;BR /&gt;win{mod(count,12)} = value;&lt;BR /&gt;r12 = sum(of win{*});&lt;BR /&gt;drop count;&lt;BR /&gt;run;&lt;/P&gt;</description>
      <pubDate>Thu, 26 Nov 2020 08:44:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Rolling-12-months-with-distinct-customer-count/m-p/701773#M214915</guid>
      <dc:creator>SURIM</dc:creator>
      <dc:date>2020-11-26T08:44:44Z</dc:date>
    </item>
  </channel>
</rss>

