<?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: Merge two datasets by ID and Date (equal or +/- 90 days) in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/638301#M189813</link>
    <description>&lt;P&gt;You can do this in SQL:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data one;
infile datalines dlm='09'x dsd truncover;
input id $ date :ddmmyy10. pulse_rate;
format date yymmddd10.;
datalines;
1	4/2/18	85
1	10/3/19	90
1	3/2/20	75
2	10/2/18	85
2	15/3/19	69
2	25/2/20	99
;

data two;
infile datalines dlm='09'x dsd truncover;
input id $ date :ddmmyy10. bp;
format date yymmddd10.;
datalines;
1	4/2/18	125
1	15/5/19	110
1	3/2/20	100
2	10/2/18	160
2	15/3/19	150
2	12/12/19	120
;

proc sql;
create table want as
  select
    one.id,
    one.date,
    one.pulse_rate,
    two.bp
  from one, two
  where one.id = two.id and abs(one.date - two.date) le 90
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Note:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;example data is presented in data steps with datalines, so everyone can easily recreate your dataset exactly as-is for testing&lt;/LI&gt;
&lt;LI&gt;if several dates fall within the 90 day range, you will get a "cartesian join", increasing the number of observations&lt;/LI&gt;
&lt;/UL&gt;</description>
    <pubDate>Wed, 08 Apr 2020 12:30:32 GMT</pubDate>
    <dc:creator>Kurt_Bremser</dc:creator>
    <dc:date>2020-04-08T12:30:32Z</dc:date>
    <item>
      <title>Merge two datasets by ID and Date (equal or +/- 90 days)</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/638297#M189810</link>
      <description>&lt;P&gt;Hi everyone, help please! I am very new to using SAS and I would like to combine two datasets by ID and Date. Some visits in the two datasets fall on the same date while some can be different +/- 90 days. Please see the below for example datasets.&lt;/P&gt;&lt;P&gt;Dataset One&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Pulse Rate&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4/2/18&lt;/TD&gt;&lt;TD&gt;85&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10/3/19&lt;/TD&gt;&lt;TD&gt;90&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3/2/20&lt;/TD&gt;&lt;TD&gt;75&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;10/2/18&lt;/TD&gt;&lt;TD&gt;85&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;15/3/19&lt;/TD&gt;&lt;TD&gt;69&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;25/2/20&lt;/TD&gt;&lt;TD&gt;99&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Dataset Two&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;BP&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4/2/18&lt;/TD&gt;&lt;TD&gt;125&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;15/5/19&lt;/TD&gt;&lt;TD&gt;110&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3/2/20&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;10/2/18&lt;/TD&gt;&lt;TD&gt;160&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;15/3/19&lt;/TD&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;12/12/19&lt;/TD&gt;&lt;TD&gt;120&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The output dataset I want is&amp;nbsp;&lt;/P&gt;&lt;TABLE border="0" cellspacing="0" cellpadding="0"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;Date&lt;/TD&gt;&lt;TD&gt;Pulse Rate&lt;/TD&gt;&lt;TD&gt;BP&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;4/2/18&lt;/TD&gt;&lt;TD&gt;85&lt;/TD&gt;&lt;TD&gt;125&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;10/3/19&lt;/TD&gt;&lt;TD&gt;90&lt;/TD&gt;&lt;TD&gt;110&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;3/2/20&lt;/TD&gt;&lt;TD&gt;75&lt;/TD&gt;&lt;TD&gt;100&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;10/2/18&lt;/TD&gt;&lt;TD&gt;85&lt;/TD&gt;&lt;TD&gt;160&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;15/3/19&lt;/TD&gt;&lt;TD&gt;69&lt;/TD&gt;&lt;TD&gt;150&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;25/2/20&lt;/TD&gt;&lt;TD&gt;99&lt;/TD&gt;&lt;TD&gt;120&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;As you can see, some visits are on different dates. But I want to merge them if the date in Dataset Two is within&amp;nbsp;&amp;nbsp;+/- 90 days of the Dataset One. Could you please advise how to write the script for this. Thanks in advance.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 08 Apr 2020 12:11:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/638297#M189810</guid>
      <dc:creator>Htein</dc:creator>
      <dc:date>2020-04-08T12:11:36Z</dc:date>
    </item>
    <item>
      <title>Re: Merge two datasets by ID and Date (equal or +/- 90 days)</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/638301#M189813</link>
      <description>&lt;P&gt;You can do this in SQL:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data one;
infile datalines dlm='09'x dsd truncover;
input id $ date :ddmmyy10. pulse_rate;
format date yymmddd10.;
datalines;
1	4/2/18	85
1	10/3/19	90
1	3/2/20	75
2	10/2/18	85
2	15/3/19	69
2	25/2/20	99
;

data two;
infile datalines dlm='09'x dsd truncover;
input id $ date :ddmmyy10. bp;
format date yymmddd10.;
datalines;
1	4/2/18	125
1	15/5/19	110
1	3/2/20	100
2	10/2/18	160
2	15/3/19	150
2	12/12/19	120
;

proc sql;
create table want as
  select
    one.id,
    one.date,
    one.pulse_rate,
    two.bp
  from one, two
  where one.id = two.id and abs(one.date - two.date) le 90
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Note:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;example data is presented in data steps with datalines, so everyone can easily recreate your dataset exactly as-is for testing&lt;/LI&gt;
&lt;LI&gt;if several dates fall within the 90 day range, you will get a "cartesian join", increasing the number of observations&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 08 Apr 2020 12:30:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/638301#M189813</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-04-08T12:30:32Z</dc:date>
    </item>
    <item>
      <title>Re: Merge two datasets by ID and Date (equal or +/- 90 days)</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639122#M190065</link>
      <description>&lt;P&gt;Thanks, Kurt. It helps. Just an additional question. I wonder if I can modify the script to link only to a nearest date in data two within +/- 90 days to avoid catersian join. Thanks again.&lt;/P&gt;</description>
      <pubDate>Sat, 11 Apr 2020 06:08:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639122#M190065</guid>
      <dc:creator>Htein</dc:creator>
      <dc:date>2020-04-11T06:08:27Z</dc:date>
    </item>
    <item>
      <title>Re: Merge two datasets by ID and Date (equal or +/- 90 days)</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639133#M190071</link>
      <description>&lt;P&gt;Expand the SQL by creating a column that holds the difference and a group by, and select for the minimum difference:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
  select
    one.id,
    one.date,
    one.pulse_rate,
    two.bp,
    abs(two.date - one.date) as datedif
  from one, two
  where one.id = two.id and abs(one.date - two.date) le 90
  group by one.id, one.date
  having datedif = min(datedif)
;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Note that you still might get two observations for a single date if you have two with the same distance.&lt;/P&gt;
&lt;P&gt;To avoid this, you would need to run a data step:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
create table want as
  select
    one.id,
    one.date,
    one.pulse_rate,
    two.bp,
    abs(two.date - one.date) as datedif
  from one, two
  where one.id = two.id and abs(one.date - two.date) le 90
  order by one.id, one.date, calculated datedif
;
quit;

data final_result;
set want;
by id date;
if first.date;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Sat, 11 Apr 2020 10:51:30 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639133#M190071</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2020-04-11T10:51:30Z</dc:date>
    </item>
    <item>
      <title>Re: Merge two datasets by ID and Date (equal or +/- 90 days)</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639389#M190221</link>
      <description>Thank you very much, Kurt. It helps me a lot.</description>
      <pubDate>Mon, 13 Apr 2020 01:48:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Merge-two-datasets-by-ID-and-Date-equal-or-90-days/m-p/639389#M190221</guid>
      <dc:creator>Htein</dc:creator>
      <dc:date>2020-04-13T01:48:05Z</dc:date>
    </item>
  </channel>
</rss>

