<?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: How to find closest date using proc sql? in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331842#M74643</link>
    <description>&lt;P&gt;Run next code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data one;
  input id name $ date1 yymmdd10. ;
  format date1 date9.;
  seq = _N_;
datalines;
101 ram 2016/01/30
101 ram 2016/02/23
101 ram 2016/02/25
102 sam 2016/02/15
; run;

data two;
  input id date yymmdd10.;
  format date date9.;
datalines;
101 2016/01/29
101 2016/01/30
102 2016/02/12
; run;

proc sql;
    create table temp as select
      a.id, a.seq, a.date1,
      b.date as date2,
      abs(a.date1 - b.date) as diff
    from one as a   
    left join two as b    
    on a.id = b.id 
    group by a.id
    order by id, seq, diff
;quit;
&lt;BR /&gt;proc sql&lt;BR /&gt;   create table want &lt;BR /&gt;   as select id, date1, date2&lt;BR /&gt;   from temp&lt;BR /&gt;   group by id, seq&lt;BR /&gt;   having min(diff)&lt;BR /&gt;; quit;&lt;BR /&gt;/* last step can be changed by: */
data want;
 set temp;
  by id seq;
     if first.seq;
run;  &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;this code will produce first output line as:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;101&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;2016/01/30&amp;nbsp;2016/01/&lt;STRONG&gt;30&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; instead&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;101&amp;nbsp;2016/01/30&amp;nbsp;2016/01/&lt;STRONG&gt;29&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;If you insist getting the&lt;STRONG&gt;&amp;nbsp;Jan 29&amp;nbsp;&lt;/STRONG&gt;then change last step to:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
 set temp(where=(diff&amp;gt;0));
  by id seq;
     if first.seq;
run;


/* OR */

data want;
 set temp;
  by id seq;&lt;BR /&gt;     retain flag; drop flag;
     if first.seq then flag=0;
     if flag=0 and diff&amp;gt;0 then do;
        output; flag=1;
     end;
run;    &lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Sat, 11 Feb 2017 17:30:30 GMT</pubDate>
    <dc:creator>Shmuel</dc:creator>
    <dc:date>2017-02-11T17:30:30Z</dc:date>
    <item>
      <title>How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331792#M74618</link>
      <description>&lt;P&gt;Hi All,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have two tables&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;EMP&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;STRONG&gt;id name $ date1 yymmdd10.;&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;101 ram 2016/01/30&lt;BR /&gt;101 ram 2016/02/23&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;101 ram 2016/02/25&lt;/SPAN&gt;&lt;BR /&gt;102 sam 2016/02/15&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;and &lt;STRONG&gt;TESTS&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;id date yymmdd10.;&lt;/STRONG&gt;&lt;BR /&gt;101 2016/01/29&lt;BR /&gt; 101 2016/01/30&lt;BR /&gt; 102 2016/02/12&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I would like to have a table like below:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;ID DATE1 Date2&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;101&amp;nbsp;&lt;SPAN&gt;2016/01/30&amp;nbsp;2016/01/29&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;101 2016/02/23&amp;nbsp;2016/01/30&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;101&amp;nbsp;2016/02/25&amp;nbsp;2016/01/30&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;102&amp;nbsp;2016/02/15&amp;nbsp;2016/02/12&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Please help!&lt;/SPAN&gt;&lt;/P&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>Sat, 11 Feb 2017 09:53:14 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331792#M74618</guid>
      <dc:creator>renjithr</dc:creator>
      <dc:date>2017-02-11T09:53:14Z</dc:date>
    </item>
    <item>
      <title>Re: How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331810#M74628</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Why is 1/29/2016 in table test closer than 1/30/2016 (also in tests) to 1/30/2016 in EMP?&lt;/P&gt;</description>
      <pubDate>Sat, 11 Feb 2017 13:50:15 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331810#M74628</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-02-11T13:50:15Z</dc:date>
    </item>
    <item>
      <title>Re: How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331842#M74643</link>
      <description>&lt;P&gt;Run next code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data one;
  input id name $ date1 yymmdd10. ;
  format date1 date9.;
  seq = _N_;
datalines;
101 ram 2016/01/30
101 ram 2016/02/23
101 ram 2016/02/25
102 sam 2016/02/15
; run;

data two;
  input id date yymmdd10.;
  format date date9.;
datalines;
101 2016/01/29
101 2016/01/30
102 2016/02/12
; run;

proc sql;
    create table temp as select
      a.id, a.seq, a.date1,
      b.date as date2,
      abs(a.date1 - b.date) as diff
    from one as a   
    left join two as b    
    on a.id = b.id 
    group by a.id
    order by id, seq, diff
;quit;
&lt;BR /&gt;proc sql&lt;BR /&gt;   create table want &lt;BR /&gt;   as select id, date1, date2&lt;BR /&gt;   from temp&lt;BR /&gt;   group by id, seq&lt;BR /&gt;   having min(diff)&lt;BR /&gt;; quit;&lt;BR /&gt;/* last step can be changed by: */
data want;
 set temp;
  by id seq;
     if first.seq;
run;  &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;this code will produce first output line as:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;SPAN&gt;101&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;2016/01/30&amp;nbsp;2016/01/&lt;STRONG&gt;30&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; instead&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;101&amp;nbsp;2016/01/30&amp;nbsp;2016/01/&lt;STRONG&gt;29&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;If you insist getting the&lt;STRONG&gt;&amp;nbsp;Jan 29&amp;nbsp;&lt;/STRONG&gt;then change last step to:&lt;/SPAN&gt;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data want;
 set temp(where=(diff&amp;gt;0));
  by id seq;
     if first.seq;
run;


/* OR */

data want;
 set temp;
  by id seq;&lt;BR /&gt;     retain flag; drop flag;
     if first.seq then flag=0;
     if flag=0 and diff&amp;gt;0 then do;
        output; flag=1;
     end;
run;    &lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 11 Feb 2017 17:30:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331842#M74643</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2017-02-11T17:30:30Z</dc:date>
    </item>
    <item>
      <title>Re: How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331845#M74645</link>
      <description>&lt;P&gt;It seems that since you want the test date 2016/01/29 and not 2016/01/30 joined with the emp date 2016/01/30, you want the latest test date that&amp;nbsp;&lt;U&gt;precedes&lt;/U&gt;&amp;nbsp;the actual date. The following SQL performs a join on ID where emp date is bigger than tests date and then selects the record with the smallest difference.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;BR /&gt;proc sql;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;create table result (drop=dif) as &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;select&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; emp.id, emp.name, emp.date1, tests.date as date2, abs(emp.date1-tests.date) as dif&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; from emp left join tests&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; on emp.id = tests.id&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where emp.date1 &amp;gt; tests.date&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; group by emp.id, emp.date1&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; having dif=min(dif);&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;101 2016-01-30 2016-01-29&lt;BR /&gt;101 2016-02-23 2016-01-30&lt;BR /&gt;101 2016-02-25 2016-01-30&lt;BR /&gt;102 2016-02-15 2016-02-12&lt;/P&gt;</description>
      <pubDate>Sat, 11 Feb 2017 17:06:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331845#M74645</guid>
      <dc:creator>ErikLund_Jensen</dc:creator>
      <dc:date>2017-02-11T17:06:34Z</dc:date>
    </item>
    <item>
      <title>Re: How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331860#M74652</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/12887"&gt;@ErikLund_Jensen&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;It seems that since you want the test date 2016/01/29 and not 2016/01/30 joined with the emp date 2016/01/30, &lt;EM&gt;&lt;FONT color="#ff0000"&gt;&lt;STRONG&gt;you want the latest test date that&amp;nbsp;&lt;U&gt;precedes&lt;/U&gt;&amp;nbsp;the actual date&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/EM&gt;. The following SQL performs a join on ID where emp date is bigger than tests date and then selects the record with the smallest difference.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;BR /&gt;proc sql;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;create table result (drop=dif) as &lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;select&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; emp.id, emp.name, emp.date1, tests.date as date2, abs(emp.date1-tests.date) as dif&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; from emp left join tests&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; on emp.id = tests.id&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where emp.date1 &amp;gt; tests.date&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; group by emp.id, emp.date1&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; having dif=min(dif);&lt;BR /&gt;quit;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;101 2016-01-30 2016-01-29&lt;BR /&gt;101 2016-02-23 2016-01-30&lt;BR /&gt;101 2016-02-25 2016-01-30&lt;BR /&gt;102 2016-02-15 2016-02-12&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Since you apparently only want test dates &lt;EM&gt;&lt;STRONG&gt;preceding&lt;/STRONG&gt;&lt;/EM&gt; emp date, you could even abstain from calclulating DIF by a suitable modification of the JOIN .. ON expression, and corresponding change to the HAVING clause.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Sasfont"&gt;&lt;STRONG&gt;proc&lt;/STRONG&gt;&lt;/FONT&gt; &lt;STRONG&gt;&lt;FONT color="#000080" face="Sasfont"&gt;sql&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT face="Sasfont"&gt;; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;&amp;nbsp; create&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Sasfont"&gt;table&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; result &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;as&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;&amp;nbsp; select&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; emp.id, emp.name, emp.date1,&lt;FONT face="Courier New"&gt;&amp;nbsp;tests&lt;/FONT&gt;.date &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;as&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; date2 &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;&amp;nbsp; from&lt;FONT face="Courier New"&gt;&amp;nbsp;emp&lt;/FONT&gt;&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Sasfont"&gt;left&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Sasfont"&gt;join&lt;FONT face="Courier New"&gt;&amp;nbsp;tests&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;&amp;nbsp; &amp;nbsp; on&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; emp.id = tests.id &lt;/FONT&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;and&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; emp.date1&amp;gt; tests.date &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#0000ff" face="Sasfont"&gt;&amp;nbsp; group&lt;/FONT&gt; &lt;FONT color="#0000ff" face="Sasfont"&gt;by&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt; emp.id, emp.date1 &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Sasfont"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;having tests.date=max(tests.date);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color="#000080" face="Sasfont"&gt;&lt;STRONG&gt;quit&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT face="Sasfont"&gt;; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Sat, 11 Feb 2017 19:37:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/331860#M74652</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2017-02-11T19:37:02Z</dc:date>
    </item>
    <item>
      <title>Re: How to find closest date using proc sql?</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/333266#M75067</link>
      <description>&lt;P&gt;Thank you all for your suggestions, appreciate it!&lt;/P&gt;</description>
      <pubDate>Thu, 16 Feb 2017 03:41:35 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-find-closest-date-using-proc-sql/m-p/333266#M75067</guid>
      <dc:creator>renjithr</dc:creator>
      <dc:date>2017-02-16T03:41:35Z</dc:date>
    </item>
  </channel>
</rss>

