<?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: Need help in left join for duplicate values in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Need-help-in-left-join-for-duplicate-values/m-p/915196#M360626</link>
    <description>&lt;P&gt;If you're also using the valid_to and valid_from columns for the join then the relationship between your tables is 1 to 1.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you only need active records then simply sub-set your tables to only select rows where valid_to_dttm is&amp;nbsp;&lt;SPAN&gt;01JAN5999:00:00:00.000000 There should only ever be one record per business key member_id.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;I wouldn't keep the valid_from and valid_to records - but if you do then you should keep the max value for valid_from_dttm as that's the earliest datetime where the values from both tables where valid.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create sample data&lt;/P&gt;
&lt;LI-SPOILER&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data table1;
  infile datalines truncover dsd;
  input member_id member_cd $ valid_from_dttm:datetime20. valid_to_dttm:datetime20.;
  format valid_from_dttm valid_to_dttm datetime20.;
  datalines;
545,ALL,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
546,EXT,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
1528,ALL,01DEC2023:10:40:45.000000,01JAN5999:00:00:00.000000
;

data table2;
  infile datalines truncover dsd;
  input member_id member_nm:$40. valid_from_dttm:datetime20. valid_to_dttm:datetime20.;
  format valid_from_dttm valid_to_dttm datetime20.;
  datalines;
545,T1_CostINC,01DEC2023:10:30:30.000000,01DEC2023:10:30:45.000000
545,T1_SE,01DEC2023:10:20:35.000000,01JAN5999:00:00:00.000000
546,T1_UK,01DEC2023:10:10:45.000000,01DEC2023:10:30:45.000000
546,T1_Raleigh 1,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
1528,XYZ,01DEC2023:10:40:45.000000,01JAN5999:00:00:00.000000
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI-SPOILER&gt;
&lt;P&gt;Logic that only uses active records:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
  create table want as
  select
    t1.member_id
    ,t1.member_cd
    ,t2.member_nm
    ,max(t1.valid_from_dttm,t2.valid_from_dttm) as valid_from_dtt format=datetime20.
    ,t1.valid_to_dttm
  from table1 t1 inner join table2 t2
  on t1.member_id=t2.member_id 
    and t1.valid_to_dttm='01JAN5999:00:00:00.000000'dt
    and t2.valid_to_dttm='01JAN5999:00:00:00.000000'dt
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If you also want to include the latest version of inactive (expired records) if there is no active record then your code would need to look somewhere along the line of below:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
  create table want as
  select
    t1.member_id
    ,t1.member_cd
    ,t2.member_nm
    ,max(t1.valid_from_dttm,t2.valid_from_dttm) as valid_from_dtt format=datetime20.
    ,t1.valid_to_dttm
  from table1 t1 inner join table2 t2
  on t1.member_id=t2.member_id 
    and t1.valid_to_dttm between t2.valid_from_dttm and t2.valid_to_dttm
    and t2.valid_from_dttm between t2.valid_from_dttm and t2.valid_to_dttm
  group by t1.member_id
  having max(t1.valid_to_dttm)=valid_to_dttm and max(t2.valid_from_dttm)=t2.valid_from_dttm
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Fri, 09 Feb 2024 05:47:06 GMT</pubDate>
    <dc:creator>Patrick</dc:creator>
    <dc:date>2024-02-09T05:47:06Z</dc:date>
    <item>
      <title>Need help in left join for duplicate values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Need-help-in-left-join-for-duplicate-values/m-p/915192#M360624</link>
      <description>&lt;DIV&gt;Need help in joining two table, Just pasted sample data here.&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;table1&lt;/DIV&gt;
&lt;DIV&gt;member_id member_cd&amp;nbsp; &amp;nbsp;valid_from_dttm&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;valid_to_dttm&lt;/DIV&gt;
&lt;DIV&gt;545&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ALL&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 01DEC2023:10:20:45.000000&amp;nbsp; &amp;nbsp;01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;546 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EXT&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:20:45.000000 01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;1528&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ALL&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 01DEC2023:10:40:45.000000 01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;table2&lt;/DIV&gt;
&lt;DIV&gt;member_id member_nm&amp;nbsp; &amp;nbsp;valid_from_dttm&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valid_to_dttm&lt;/DIV&gt;
&lt;DIV&gt;545 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T1_CostINC&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 01DEC2023:10:30:30.000000&amp;nbsp; 01DEC2023:10:30:45.000000&lt;/DIV&gt;
&lt;DIV&gt;545 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T1_SE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:20:35.000000&amp;nbsp; &amp;nbsp; 01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;546 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T1_UK&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 01DEC2023:10:10:45.000000&amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:30:45.000000&lt;/DIV&gt;
&lt;DIV&gt;546&amp;nbsp; &amp;nbsp; &amp;nbsp; T1_Raleigh 1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:20:45.000000&amp;nbsp; &amp;nbsp; &amp;nbsp;01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;1528&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XYZ&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:40:45.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;I have this kind of data , as you can see i have one to many relation, I wanted to do a left join based on member_id&lt;/DIV&gt;
&lt;DIV&gt;also I want the coloumns where valid_to_dttm is having maximun value&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;here for member_id 545 the record I want to take is of maximum valid_to_dttm value fro table2&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;so output expected here is&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;member_id&amp;nbsp; member_cd member _nm&amp;nbsp; &amp;nbsp; &amp;nbsp;valid_from_dttm&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; valid_to_dttm&lt;/DIV&gt;
&lt;DIV&gt;545&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ALL &amp;nbsp; &amp;nbsp; T1_SE&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:20:35.000000&amp;nbsp; &amp;nbsp; 0 1JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;546&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EXT &amp;nbsp; &amp;nbsp;T1_Raleigh 1&amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:20:45.000000&amp;nbsp; &amp;nbsp; &amp;nbsp;01JAN5999:00:00:00.000000&lt;/DIV&gt;
&lt;DIV&gt;1528&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ALL&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; XYZ&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01DEC2023:10:40:45.000000&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;01JAN5999:00:00:00.000000&lt;/DIV&gt;</description>
      <pubDate>Fri, 09 Feb 2024 04:41:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Need-help-in-left-join-for-duplicate-values/m-p/915192#M360624</guid>
      <dc:creator>Aexor</dc:creator>
      <dc:date>2024-02-09T04:41:05Z</dc:date>
    </item>
    <item>
      <title>Re: Need help in left join for duplicate values</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Need-help-in-left-join-for-duplicate-values/m-p/915196#M360626</link>
      <description>&lt;P&gt;If you're also using the valid_to and valid_from columns for the join then the relationship between your tables is 1 to 1.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you only need active records then simply sub-set your tables to only select rows where valid_to_dttm is&amp;nbsp;&lt;SPAN&gt;01JAN5999:00:00:00.000000 There should only ever be one record per business key member_id.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;I wouldn't keep the valid_from and valid_to records - but if you do then you should keep the max value for valid_from_dttm as that's the earliest datetime where the values from both tables where valid.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create sample data&lt;/P&gt;
&lt;LI-SPOILER&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data table1;
  infile datalines truncover dsd;
  input member_id member_cd $ valid_from_dttm:datetime20. valid_to_dttm:datetime20.;
  format valid_from_dttm valid_to_dttm datetime20.;
  datalines;
545,ALL,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
546,EXT,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
1528,ALL,01DEC2023:10:40:45.000000,01JAN5999:00:00:00.000000
;

data table2;
  infile datalines truncover dsd;
  input member_id member_nm:$40. valid_from_dttm:datetime20. valid_to_dttm:datetime20.;
  format valid_from_dttm valid_to_dttm datetime20.;
  datalines;
545,T1_CostINC,01DEC2023:10:30:30.000000,01DEC2023:10:30:45.000000
545,T1_SE,01DEC2023:10:20:35.000000,01JAN5999:00:00:00.000000
546,T1_UK,01DEC2023:10:10:45.000000,01DEC2023:10:30:45.000000
546,T1_Raleigh 1,01DEC2023:10:20:45.000000,01JAN5999:00:00:00.000000
1528,XYZ,01DEC2023:10:40:45.000000,01JAN5999:00:00:00.000000
;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI-SPOILER&gt;
&lt;P&gt;Logic that only uses active records:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
  create table want as
  select
    t1.member_id
    ,t1.member_cd
    ,t2.member_nm
    ,max(t1.valid_from_dttm,t2.valid_from_dttm) as valid_from_dtt format=datetime20.
    ,t1.valid_to_dttm
  from table1 t1 inner join table2 t2
  on t1.member_id=t2.member_id 
    and t1.valid_to_dttm='01JAN5999:00:00:00.000000'dt
    and t2.valid_to_dttm='01JAN5999:00:00:00.000000'dt
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;If you also want to include the latest version of inactive (expired records) if there is no active record then your code would need to look somewhere along the line of below:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;proc sql;
  create table want as
  select
    t1.member_id
    ,t1.member_cd
    ,t2.member_nm
    ,max(t1.valid_from_dttm,t2.valid_from_dttm) as valid_from_dtt format=datetime20.
    ,t1.valid_to_dttm
  from table1 t1 inner join table2 t2
  on t1.member_id=t2.member_id 
    and t1.valid_to_dttm between t2.valid_from_dttm and t2.valid_to_dttm
    and t2.valid_from_dttm between t2.valid_from_dttm and t2.valid_to_dttm
  group by t1.member_id
  having max(t1.valid_to_dttm)=valid_to_dttm and max(t2.valid_from_dttm)=t2.valid_from_dttm
  ;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 09 Feb 2024 05:47:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Need-help-in-left-join-for-duplicate-values/m-p/915196#M360626</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2024-02-09T05:47:06Z</dc:date>
    </item>
  </channel>
</rss>

