<?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: Match rows on multiple variables in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/944526#M370065</link>
    <description>&lt;P&gt;You could change raw data from DATE into YEAR, no need to change code at all.&lt;/P&gt;
&lt;P&gt;Like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input DIRECTORID            COMPANYID             DATESTARTROLE             DATEENDROLE ;
cards;
1                                              1001                            1998                2021
2                                              1001                            2020                2021
3                                              1001                            2010                2011
1                                              1002                            2021                2024
2                                              1002                            2023                2024
4                                              1002                            1988                2023
;
data temp;
 set have(keep=DIRECTORID  COMPANYID DATESTARTROLE  DATEENDROLE);
 do date=DATESTARTROLE to DATEENDROLE;
   output;
 end;
 keep COMPANYID  date DIRECTORID;
run;
proc sort data=temp nodupkey;
by  COMPANYID date DIRECTORID;
run;
data temp2;
 do until(last.date);
   set temp;
   by COMPANYID date;
   length list $ 200;
   list=catx('|',list,DIRECTORID);
 end;
 if findc(list,'|');
 drop DIRECTORID ;
 run;
 data temp3;
 if _n_=1 then do;
  if 0 then set temp2;
  declare hash h(dataset:'temp2',hashexp:20);
  h.definekey('COMPANYID','date');
  h.definedata('list');
  h.definedone();
 end;
set have;
length key $ 40;
 do date=DATESTARTROLE to DATEENDROLE;
   if h.find()=0 then do;
     do i=1 to countw(list,'|');
       key=scan(list,i,'|');
	   output;
	 end;
   end;
 end;
keep DIRECTORID key;
run;
proc sql;
create table want as
select DIRECTORID,count(distinct key)-1 as MATCHES
 from temp3
  group by DIRECTORID;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Thu, 19 Sep 2024 00:25:04 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2024-09-19T00:25:04Z</dc:date>
    <item>
      <title>Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940382#M369114</link>
      <description>&lt;P&gt;I HAVE the following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DIRECTORID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPANYID &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DATESTARTROLE&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; DATEENDROLE&lt;/P&gt;&lt;P&gt;1&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;&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; 1001&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; 01JUL1998&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; 05MAR2021&lt;/P&gt;&lt;P&gt;2&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;&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; 1001&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; 01APR2020&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; 05MAR2021&lt;/P&gt;&lt;P&gt;3&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;&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; 1001&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; 01JUL2010&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; 01MAY2011&lt;/P&gt;&lt;P&gt;1&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;&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; 1002&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; 06MAR2021&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; 07MAR2024&lt;/P&gt;&lt;P&gt;2&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;&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; 1002&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; 06JUL2023&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; 05MAY2024&lt;/P&gt;&lt;P&gt;4&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;&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; 1002&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; 01APR1988&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; 15JUN2023&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I WANT the following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;DIRECTORID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MATCHES&lt;/P&gt;&lt;P&gt;1&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;&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; 3&lt;/P&gt;&lt;P&gt;2&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;&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; 1&lt;/P&gt;&lt;P&gt;3&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;&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; 1&lt;/P&gt;&lt;P&gt;4&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;&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; 1&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Where MATCHES captures the unique number of DIRECTORIDs where employment at the COMPANYID overlaps.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have over 3,000,000 observations.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Are there any suggestions on how to get my expected output?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you!!&lt;/P&gt;</description>
      <pubDate>Wed, 21 Aug 2024 19:23:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940382#M369114</guid>
      <dc:creator>teamlinerek</dc:creator>
      <dc:date>2024-08-21T19:23:07Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940387#M369117</link>
      <description>&lt;P&gt;I think you may need to walk us through the logic of how you get Directorid=1 and a result of 3, as in all the variables compared. I only see 2 values of Directorid=1 so there is obviously something else going on.&lt;/P&gt;</description>
      <pubDate>Wed, 21 Aug 2024 19:34:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940387#M369117</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2024-08-21T19:34:07Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940437#M369131</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input DIRECTORID            COMPANYID             DATESTARTROLE      :date9.         DATEENDROLE :date9.;
format   DATESTARTROLE        DATEENDROLE :date9.;
cards;
1                                              1001                            01JUL1998                 05MAR2021
2                                              1001                            01APR2020                05MAR2021
3                                              1001                            01JUL2010                 01MAY2011
1                                              1002                            06MAR2021               07MAR2024
2                                              1002                            06JUL2023                 05MAY2024
4                                              1002                            01APR1988                15JUN2023
;
data temp;
 set have(keep=DIRECTORID  COMPANYID DATESTARTROLE  DATEENDROLE);
 do date=DATESTARTROLE to DATEENDROLE;
   output;
 end;
 keep COMPANYID  date DIRECTORID;
 format date date9.;
run;
proc sort data=temp nodupkey;
by  COMPANYID date DIRECTORID;
run;
data temp2;
 do until(last.date);
   set temp;
   by COMPANYID date;
   length list $ 200;
   list=catx('|',list,DIRECTORID);
 end;
 if findc(list,'|');
 drop DIRECTORID ;
 run;
 data temp3;
 if _n_=1 then do;
  if 0 then set temp2;
  declare hash h(dataset:'temp2',hashexp:20);
  h.definekey('COMPANYID','date');
  h.definedata('list');
  h.definedone();
 end;
set have;
length key $ 40;
 do date=DATESTARTROLE to DATEENDROLE;
   if h.find()=0 then do;
     do i=1 to countw(list,'|');
       key=scan(list,i,'|');
	   output;
	 end;
   end;
 end;
keep DIRECTORID key;
run;
proc sql;
create table want as
select DIRECTORID,count(distinct key)-1 as MATCHES
 from temp3
  group by DIRECTORID;
quit;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 22 Aug 2024 06:23:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940437#M369131</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-08-22T06:23:08Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940476#M369151</link>
      <description>&lt;P&gt;Thank you for asking!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The logic is that for director 1, employment overlaps with directors 2, 3, 4 for a total of 3 matches.&lt;/P&gt;&lt;P&gt;For director 2, employment overlaps with only director 1.&lt;/P&gt;&lt;P&gt;For director 3, employment overlaps with only director 1.&lt;/P&gt;&lt;P&gt;For director 4, employment overlaps with only director 1.&lt;/P&gt;</description>
      <pubDate>Thu, 22 Aug 2024 15:24:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940476#M369151</guid>
      <dc:creator>teamlinerek</dc:creator>
      <dc:date>2024-08-22T15:24:02Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940490#M369153</link>
      <description>Thank you!&lt;BR /&gt;&lt;BR /&gt;I ran this code using the whole set and ran out of resources on the first "temp" query, even after eliminating unnecessary files. I ran the same code on a smaller subset, and it worked!&lt;BR /&gt;&lt;BR /&gt;I am concerned about splitting the file and double counting directorids where they overlap in more than one companyid.&lt;BR /&gt;&lt;BR /&gt;Do you have any suggestions for rerunning the code?</description>
      <pubDate>Thu, 22 Aug 2024 16:34:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940490#M369153</guid>
      <dc:creator>teamlinerek</dc:creator>
      <dc:date>2024-08-22T16:34:07Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940553#M369162</link>
      <description>&lt;P&gt;Yes. You could split this big table into several smaller subset dataset. But it is a little complicated.&lt;BR /&gt;/******First subset ******/&lt;BR /&gt;data have1;&lt;BR /&gt;set have;&lt;BR /&gt;if COMPANYID in (1001) ;&lt;BR /&gt;run;&lt;BR /&gt;data temp;&lt;BR /&gt;set have1;&lt;BR /&gt;..............until............&lt;BR /&gt;data temp3_1;&lt;BR /&gt;....................&lt;BR /&gt;keep DIRECTORID key;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;/******Second subset ******/&lt;BR /&gt;data have2;&lt;BR /&gt;set have;&lt;BR /&gt;if COMPANYID in (1002) ;&lt;BR /&gt;run;&lt;BR /&gt;data temp;&lt;BR /&gt;set have2;&lt;BR /&gt;..............until............&lt;BR /&gt;data temp3_2;&lt;BR /&gt;....................&lt;BR /&gt;keep DIRECTORID key;&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;/******Combine these output datasets together And run the final PROC SQL********/&lt;BR /&gt;data temp3_all;&lt;BR /&gt;set temp3_1 temp3_2;&lt;BR /&gt;run;&lt;BR /&gt;proc sql;&lt;BR /&gt;create table want as&lt;BR /&gt;select DIRECTORID,count(distinct key)-1 as MATCHES&lt;BR /&gt;from temp3_all&lt;BR /&gt;group by DIRECTORID;&lt;BR /&gt;quit;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 23 Aug 2024 07:10:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/940553#M369162</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-08-23T07:10:43Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/944431#M370034</link>
      <description>Can this code be rewritten for overlaps in years instead of days?&lt;BR /&gt;&lt;BR /&gt;Thank you!</description>
      <pubDate>Wed, 18 Sep 2024 14:36:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/944431#M370034</guid>
      <dc:creator>teamlinerek</dc:creator>
      <dc:date>2024-09-18T14:36:53Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/944526#M370065</link>
      <description>&lt;P&gt;You could change raw data from DATE into YEAR, no need to change code at all.&lt;/P&gt;
&lt;P&gt;Like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input DIRECTORID            COMPANYID             DATESTARTROLE             DATEENDROLE ;
cards;
1                                              1001                            1998                2021
2                                              1001                            2020                2021
3                                              1001                            2010                2011
1                                              1002                            2021                2024
2                                              1002                            2023                2024
4                                              1002                            1988                2023
;
data temp;
 set have(keep=DIRECTORID  COMPANYID DATESTARTROLE  DATEENDROLE);
 do date=DATESTARTROLE to DATEENDROLE;
   output;
 end;
 keep COMPANYID  date DIRECTORID;
run;
proc sort data=temp nodupkey;
by  COMPANYID date DIRECTORID;
run;
data temp2;
 do until(last.date);
   set temp;
   by COMPANYID date;
   length list $ 200;
   list=catx('|',list,DIRECTORID);
 end;
 if findc(list,'|');
 drop DIRECTORID ;
 run;
 data temp3;
 if _n_=1 then do;
  if 0 then set temp2;
  declare hash h(dataset:'temp2',hashexp:20);
  h.definekey('COMPANYID','date');
  h.definedata('list');
  h.definedone();
 end;
set have;
length key $ 40;
 do date=DATESTARTROLE to DATEENDROLE;
   if h.find()=0 then do;
     do i=1 to countw(list,'|');
       key=scan(list,i,'|');
	   output;
	 end;
   end;
 end;
keep DIRECTORID key;
run;
proc sql;
create table want as
select DIRECTORID,count(distinct key)-1 as MATCHES
 from temp3
  group by DIRECTORID;
quit;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 19 Sep 2024 00:25:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/944526#M370065</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2024-09-19T00:25:04Z</dc:date>
    </item>
    <item>
      <title>Re: Match rows on multiple variables</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/945517#M370427</link>
      <description>&lt;P&gt;Sort your data by companyid/datestartrole, then you can discover the matches one company at a time:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
input DIRECTORID COMPANYID DATESTARTROLE :date9.  DATEENDROLE :date9.;
format   DATESTARTROLE        DATEENDROLE :date9.;
cards;
1 1001 01JUL1998 05MAR2021
2 1001 01APR2020 05MAR2021
3 1001 01JUL2010 01MAY2011
1 1002 06MAR2021 07MAR2024
2 1002 06JUL2023 05MAY2024
4 1002 01APR1988 15JUN2023
;

proc sort data=have out=need;
  by companyid datestartrole;
run;

%let max_size=50;  /*Max possible N of concurrent directors*/
data _null_;
  array curr_dirs {&amp;amp;max_size} _temporary_;
  array exdates   {&amp;amp;max_size} _temporary_;
  array exdirs    {&amp;amp;max_size} _temporary_;

  if _n_=1 then do;
    declare hash overlaps();
      overlaps.definekey('dir1','dir2');
      overlaps.definedone();
    declare hash hwant(ordered:'a');
      hwant.definekey('directorid');
      hwant.definedata('directorid','matches');
      hwant.definedone();
  end;

  set need end=end_of_need;
  by companyid datestartrole;

  if first.companyid then call missing(of curr_dirs{*},of exdates{*},of exdirs{*});

  /* First obs for this dir?  Make a new hwant entry with matches=0*/
  if hwant.find(key:directorid)^=0 then hwant.add(key:directorid,data:directorid,data:0);

  /* Remove dirs from CURR_DIRS with exit dates prior to datestartrole*/
  min_exdate=min(of exdates{*},'31dec9999'd);
  do while (min_exdate&amp;lt;datestartrole);
    e=whichn(min(of exdates{*}),of exdates{*});
    d=whichn(exdirs{e},of curr_dirs{*});
    call missing (curr_dirs{d},exdates{e},exdirs{e});
    min_exdate=min(of exdates{*},'31dec9999'd);
  end;

  /*Add the new director's exitdate to upcoming exit list */
  do e=1 by 1 until(exdates{e}=.); end; /*Identify leftmost missing exdate */
  exdates{e}=dateendrole;
  exdirs{e}=directorid;
  /* Add this director to curr_dirs array*/
  do d=1 by 1 until(curr_dirs{d}=.); end; 
  curr_dirs{d}=directorid;

  do d=1 to n(of curr_dirs{*});
    dir1=directorid;
    dir2=smallest(d,of curr_dirs{*});
    if dir2=dir1 then continue;
    if overlaps.find()=0 then continue; /*Skip below If this overlap already extablished*/
    overlaps.add(key:dir1,key:dir2,data:dir1,data:dir2);    /* dir1/dir2 */
    overlaps.add(key:dir2,key:dir1,data:dir2,data:dir1);    /* dir2/dir1 */
    do directorid=dir2,dir1;
      hwant.find();
      matches+1;
      hwant.replace();
    end;
  end;

  if end_of_need then hwant.output(dataset:'want');
run;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;One company at a time, this program dynamically updates arrays listing the current directors, and the upcoming director exit dates.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;It uses those arrays to update two hashes over all companies:&amp;nbsp; (1) OVERLAPS which records each pair of directors having an overlap, and (2) HWANT, which keeps track of the count of overlaps for each dir.&amp;nbsp; If a pair of directors overlaps more than once, it counts as only one in the MATHES variable.&lt;/P&gt;</description>
      <pubDate>Sat, 28 Sep 2024 02:35:44 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Match-rows-on-multiple-variables/m-p/945517#M370427</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2024-09-28T02:35:44Z</dc:date>
    </item>
  </channel>
</rss>

