<?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: Join 2 tables based on unique ID and specific date criteria in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315883#M68949</link>
    <description>&lt;PRE&gt;
Once you got that table. That would be easy.


data have;
infile cards expandtabs truncover;
input ID	DATE1 : mmddyy10.	DATE2 : mmddyy10.	TIME;
format date1 date2 mmddyy10.;
n+1;
cards;
1	9/30/2014	9/29/2014	1	YES
1	9/30/2014	9/28/2014	2	YES
1	9/30/2014	9/27/2014	3	YES
1	10/1/2014	9/29/2014	2	NO
1	10/1/2014	9/28/2014	3	NO
2	10/1/2014	9/30/2014	1	YES
2	10/1/2014	9/29/2014	2	YES
2	10/1/2014	9/28/2014	3	YES
3	10/8/2014	10/7/2014	1	NO
3	10/8/2014	10/6/2014	2	NO
3	10/10/2014	10/9/2014	1	YES
3	10/10/2014	10/8/2014	2	YES
3	10/10/2014	10/7/2014	3	YES
4	11/3/2014	11/2/2014	1	NO
4	11/3/2014	11/1/2014	2	NO
4	11/5/2014	11/4/2014	1	YES
4	11/5/2014	11/3/2014	2	YES
4	11/5/2014	11/2/2014	3	YES
4	11/7/2014	11/6/2014	1	YES
4	11/7/2014	11/5/2014	2	YES
4	11/7/2014	11/4/2014	3
;
run;
data key;
 set have;
 if time=3 and
    lag(time)=2 and id=lag(id) and
    lag2(time)=1 and id=lag2(id) then do;
 output;
 n=n-1;output;
 n=n-1;output;
 end;
keep n;
run;
data want;
 if _n_=1 then do;
  if 0 then set key;
  declare hash h(dataset:'key');
  h.definekey('n');
  h.definedone();
 end;
set have;
if h.check()=0;
drop n;
run;


&lt;/PRE&gt;</description>
    <pubDate>Thu, 01 Dec 2016 10:42:09 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2016-12-01T10:42:09Z</dc:date>
    <item>
      <title>Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315621#M68881</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I want to join 2 tables by ID and Date such that table 1 Date is matched to the 3 prior consecutive table 2 Dates.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The TIME variable in the below example table is calculated as (TIME=t1.DATE-t2.DATE) and I'm only interested when TIME is 1, 2 and 3. See table below for example data. How can I do this either using proc sql or data steps?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="397"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;t1.ID&lt;/TD&gt;
&lt;TD width="97"&gt;t1.DATE&lt;/TD&gt;
&lt;TD width="97"&gt;t2.DATE&lt;/TD&gt;
&lt;TD width="47"&gt;TIME&lt;/TD&gt;
&lt;TD width="80"&gt;KEEP&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;1&lt;/TD&gt;
&lt;TD width="97"&gt;9/30/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/29/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;1&lt;/TD&gt;
&lt;TD width="97"&gt;9/30/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/28/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;1&lt;/TD&gt;
&lt;TD width="97"&gt;9/30/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/27/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;1&lt;/TD&gt;
&lt;TD width="97"&gt;10/1/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/29/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;1&lt;/TD&gt;
&lt;TD width="97"&gt;10/1/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/28/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;2&lt;/TD&gt;
&lt;TD width="97"&gt;10/1/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/30/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;2&lt;/TD&gt;
&lt;TD width="97"&gt;10/1/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/29/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;2&lt;/TD&gt;
&lt;TD width="97"&gt;10/1/2014&lt;/TD&gt;
&lt;TD width="97"&gt;9/28/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;3&lt;/TD&gt;
&lt;TD width="97"&gt;10/8/2014&lt;/TD&gt;
&lt;TD width="97"&gt;10/7/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;3&lt;/TD&gt;
&lt;TD width="97"&gt;10/8/2014&lt;/TD&gt;
&lt;TD width="97"&gt;10/6/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;3&lt;/TD&gt;
&lt;TD width="97"&gt;10/10/2014&lt;/TD&gt;
&lt;TD width="97"&gt;10/9/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;3&lt;/TD&gt;
&lt;TD width="97"&gt;10/10/2014&lt;/TD&gt;
&lt;TD width="97"&gt;10/8/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;3&lt;/TD&gt;
&lt;TD width="97"&gt;10/10/2014&lt;/TD&gt;
&lt;TD width="97"&gt;10/7/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/3/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/2/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/3/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/1/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;NO&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/5/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/4/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/5/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/3/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/5/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/2/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/7/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/6/2014&lt;/TD&gt;
&lt;TD width="47"&gt;1&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/7/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/5/2014&lt;/TD&gt;
&lt;TD width="47"&gt;2&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="76"&gt;4&lt;/TD&gt;
&lt;TD width="97"&gt;11/7/2014&lt;/TD&gt;
&lt;TD width="97"&gt;11/4/2014&lt;/TD&gt;
&lt;TD width="47"&gt;3&lt;/TD&gt;
&lt;TD&gt;YES&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;</description>
      <pubDate>Wed, 30 Nov 2016 18:42:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315621#M68881</guid>
      <dc:creator>WAL83</dc:creator>
      <dc:date>2016-11-30T18:42:57Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315646#M68885</link>
      <description>&lt;P&gt;Try next code:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc sql;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;create table want as select&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.id , t1.date, t2.date&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; from table1 as t1&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; join table2 as t2&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; on t1.id = t2.id and&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (t1.date - t2.date) in (1,2,3)&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;order by id;&lt;/P&gt;
&lt;P&gt;quit;&lt;/P&gt;</description>
      <pubDate>Wed, 30 Nov 2016 19:34:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315646#M68885</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2016-11-30T19:34:39Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315725#M68911</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For performances reasons, I would adapt&amp;nbsp;your PROC&amp;nbsp;SQL as follow:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc sql;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;create table want as select&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t.id , t1.date, t2.date&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; from table1 as t1&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; inner join table2 as t2&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;on t1.id = t2.id&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &lt;STRONG&gt;where (t1.date - t2.date) in (1, 2, 3)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;order by&amp;nbsp;id;&lt;/P&gt;
&lt;P&gt;quit;&lt;/P&gt;</description>
      <pubDate>Wed, 30 Nov 2016 22:37:49 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315725#M68911</guid>
      <dc:creator>Florent</dc:creator>
      <dc:date>2016-11-30T22:37:49Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315730#M68914</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This gets very close, thank you. The below code restricts to 1st, 2nd and 3rd prior record but I need to combine records only if there are 3 consecutive dates from table 2. See below table for example of records to keep (&lt;STRONG&gt;&lt;FONT color="#339966"&gt;yes&lt;/FONT&gt;&lt;/STRONG&gt;) and not keep (&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;no&lt;/FONT&gt;&lt;/STRONG&gt;). I apologize if I wasn't clear on my original post.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;proc sql;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;create table WANT as&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;select distinct t1.ID, t1.DATE, t2.STARTDATE, (t1.DATE-t2.STARTDATE) as TIME, t2.*&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;from TABLE1 as t1&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;join TABLE2 as t2 on (t1.ID=t2.ID) and (t1.DATE - t2.STARTDATE) in (1,2,3)&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;order by ID, Date, STARTDATE desc;&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;TABLE width="719"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;ID&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;DATE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;STARTDATE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;TIME&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="54"&gt;&lt;STRONG&gt;KEEP&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="345"&gt;&lt;STRONG&gt;NOTE&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2022&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/30/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/29/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="3"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;This consecutive group contains (1, 2 &amp;amp; 3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2022&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/30/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/28/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2022&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/30/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;9/27/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2022&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;9/29/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="2"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This consecutive group does not include (1)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2022&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;9/28/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2091&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;9/30/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="2"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This non-consecutive group does not include (2)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2091&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;9/28/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2092&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/8/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/7/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="2"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This consecutive group does not include (3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2092&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/8/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;10/6/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2092&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/10/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/9/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="3"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;This consecutive group contains (1, 2 &amp;amp; 3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2092&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/10/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/8/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2092&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/10/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;10/7/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/3/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/2/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="2"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This consecutive group does not include (3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/3/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/5/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;11/2/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This only contains (3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/7/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/6/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="3"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;This consecutive group contains (1, 2 &amp;amp; 3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/7/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/5/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;2094&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/7/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;11/4/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;3&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#339966"&gt;YES&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2099&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;12/3/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;12/2/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD rowspan="2"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;This consecutive group does not include (3)&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD width="77"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2099&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="89"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;12/3/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="107"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;12/1/2014&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD width="47"&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;FONT color="#FF0000"&gt;NO&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 30 Nov 2016 22:59:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315730#M68914</guid>
      <dc:creator>WAL83</dc:creator>
      <dc:date>2016-11-30T22:59:28Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315731#M68915</link>
      <description>&lt;P&gt;Thanks for the where clause clarification. I will need that when working on larger datasets which I often do.&lt;/P&gt;</description>
      <pubDate>Wed, 30 Nov 2016 23:01:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315731#M68915</guid>
      <dc:creator>WAL83</dc:creator>
      <dc:date>2016-11-30T23:01:12Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315801#M68930</link>
      <description>&lt;P&gt;You can filter non consequtive IDs by counting observations per ID and saving those with count=3.&lt;/P&gt;
&lt;P&gt;It will be easyer to be done as second step, like:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;proc freq data=want;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; table ID / out=temp1(keep=ID _freq_ where=(_FREQ_ = 3));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;data want;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp;merge want&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp1(in=in1);&lt;/P&gt;
&lt;P&gt;&amp;nbsp; by ID;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if in1;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;</description>
      <pubDate>Thu, 01 Dec 2016 04:06:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315801#M68930</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2016-12-01T04:06:34Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315829#M68934</link>
      <description>&lt;P&gt;This&amp;nbsp;SAS program uses&amp;nbsp; a hash table to accumulate&amp;nbsp;table 2 records.&amp;nbsp; Then when a table 1 record is in hand and&amp;nbsp;the 3 immediately preceding dates are in the&amp;nbsp;hash,&amp;nbsp;then retrieve from the hash and output:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Notes:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Both table 1 and table 2 (datasets T1 and T2) are assumed to be sorted by id/date.&lt;/LI&gt;
&lt;LI&gt;The "set t1 t2;&amp;nbsp; by id date;" statements mean that the T1 and T2 records will be interleaved by id/date.&amp;nbsp; And whenever a T1 and T2 record have the same id/date, then the T1 record precedes the tied T2 record.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;The hash is cleared when an ID is completely processed.&lt;/LI&gt;
&lt;LI&gt;This will be faster than SQL for any sizable data set.&lt;/LI&gt;
&lt;/OL&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;dm 'clear log';
data t1;
  input id date :mmddyy10.;
  format date yymmddn8.;
datalines;
1 9/30/2014 
1 10/1/2014 
2 10/1/2014 
3 10/8/2014 
3 10/10/2014
4 11/3/2014 
4 11/5/2014 
4 11/7/2014 
run;

data t2;
  input id date :mmddyy10.;
  format date yymmddn8.;
datalines;
1    9/27/2014
1    9/28/2014
1    9/29/2014
2    9/28/2014
2    9/29/2014
2    9/30/2014
3   10/06/2014
3   10/07/2014
3   10/08/2014
3   10/09/2014
4   11/01/2014
4   11/02/2014
4   11/03/2014
4   11/04/2014
4   11/05/2014
4   11/06/2014
run;

data want (drop=rc rename=(date=date2));

  if 0 then set t1 (rename=(date=date1)) t2 ; /* set the PDV*/

  if _n_=1 then do;
    declare hash h (dataset:'t2 (obs=0)');
      h.definekey('date');
      h.definedata(all:'Y');
      h.definedone();
  end;
  
  do until (last.id);
    set t1 (in=in1)  t2 (in=in2) ;
    by id date;

    if in2 then h.add();
    else if in1 then do;
      date1=date; 
      rc=h.check(key:date1-1)
        +h.check(key:date1-2)
        +h.check(key:date1-3);
      if rc=0 then do time=1 to 3;
        h.find(key:date1-time);
        output;
      end;
    end;
  end;
  rc=h.clear();
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 01 Dec 2016 06:39:03 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315829#M68934</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2016-12-01T06:39:03Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315883#M68949</link>
      <description>&lt;PRE&gt;
Once you got that table. That would be easy.


data have;
infile cards expandtabs truncover;
input ID	DATE1 : mmddyy10.	DATE2 : mmddyy10.	TIME;
format date1 date2 mmddyy10.;
n+1;
cards;
1	9/30/2014	9/29/2014	1	YES
1	9/30/2014	9/28/2014	2	YES
1	9/30/2014	9/27/2014	3	YES
1	10/1/2014	9/29/2014	2	NO
1	10/1/2014	9/28/2014	3	NO
2	10/1/2014	9/30/2014	1	YES
2	10/1/2014	9/29/2014	2	YES
2	10/1/2014	9/28/2014	3	YES
3	10/8/2014	10/7/2014	1	NO
3	10/8/2014	10/6/2014	2	NO
3	10/10/2014	10/9/2014	1	YES
3	10/10/2014	10/8/2014	2	YES
3	10/10/2014	10/7/2014	3	YES
4	11/3/2014	11/2/2014	1	NO
4	11/3/2014	11/1/2014	2	NO
4	11/5/2014	11/4/2014	1	YES
4	11/5/2014	11/3/2014	2	YES
4	11/5/2014	11/2/2014	3	YES
4	11/7/2014	11/6/2014	1	YES
4	11/7/2014	11/5/2014	2	YES
4	11/7/2014	11/4/2014	3
;
run;
data key;
 set have;
 if time=3 and
    lag(time)=2 and id=lag(id) and
    lag2(time)=1 and id=lag2(id) then do;
 output;
 n=n-1;output;
 n=n-1;output;
 end;
keep n;
run;
data want;
 if _n_=1 then do;
  if 0 then set key;
  declare hash h(dataset:'key');
  h.definekey('n');
  h.definedone();
 end;
set have;
if h.check()=0;
drop n;
run;


&lt;/PRE&gt;</description>
      <pubDate>Thu, 01 Dec 2016 10:42:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/315883#M68949</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2016-12-01T10:42:09Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/316055#M69012</link>
      <description>&lt;P&gt;For what it's still worth, here below my small contribution (using simple PROC SQL/Datasteps):&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
     create table have as
         select  distinct t.id
         ,          t1.date
         ,          t2.date as StartDate
    from table1 as t1
    inner join table2 as t2
         on t1.id = t2.id
    where (t1.date - t2.date) in (1, 2, 3)
    order by id, date, StartDate desc;
quit;

data WANT_Selection (drop= Previous_: count StartDate Time);
	set have;
	by ID Date descending StartDate;

	retain count;

	Previous_Date = LAG1(Date);
	Previous_Time = LAG1(Time);

	if first.Date then do;
		count = 0;
		if Time = 1 then count + 1;
	end; else
	if not first.Date then do;
		if Previous_Date = Date and count &amp;lt; 3 then do;
			if (Previous_Time = 1 and Time = 2) or (Previous_Time = 2 and Time = 3) then count + 1;
		end;
	end;

	if last.Date and count &amp;gt;= 3 then output;
run;

data want;
	merge have 		   (in=inHave)
		   want_selection (in=inSelection);
	by ID Date;

	if inSelection;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Thu, 01 Dec 2016 19:22:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/316055#M69012</guid>
      <dc:creator>Florent</dc:creator>
      <dc:date>2016-12-01T19:22:34Z</dc:date>
    </item>
    <item>
      <title>Re: Join 2 tables based on unique ID and specific date criteria</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/316099#M69027</link>
      <description>&lt;P&gt;Thank you for all the responses! Again, sorry for my delayed response.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;After some testing I finally got your hash code to work with one small modification. The test code worked perfectly, but my actual T2 dataset had another 40+ variables so I added the &lt;U&gt;below&lt;/U&gt; to your code. Hash tables are new to me so I'm not totally clear why I needed to add the multidata part. Thank you.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Courier New" size="2"&gt;declare&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Courier New" size="2"&gt;hash&lt;/FONT&gt;&lt;FONT face="Courier New" size="2"&gt; h (dataset:&lt;/FONT&gt;&lt;FONT color="#800080" face="Courier New" size="2"&gt;'t22 (obs=0)'&lt;/FONT&gt;&lt;FONT face="Courier New" size="2"&gt;,&lt;U&gt;&lt;EM&gt; &lt;STRONG&gt;multidata: &lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/FONT&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;FONT color="#800080" face="Courier New" size="2"&gt;"Y"&lt;/FONT&gt;&lt;FONT face="Courier New" size="2"&gt;);&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 01 Dec 2016 22:42:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Join-2-tables-based-on-unique-ID-and-specific-date-criteria/m-p/316099#M69027</guid>
      <dc:creator>WAL83</dc:creator>
      <dc:date>2016-12-01T22:42:20Z</dc:date>
    </item>
  </channel>
</rss>

