<?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 defineKey in hash object join in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872121#M344554</link>
    <description>&lt;P&gt;I should transform a proc sql join into a hash, but I'm having trouble because I don't know how to define the "DefineKey" since there are various operations, not a single key to define.&lt;BR /&gt;this is the example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data RUOLO_DANNI;
input cod_source:$2. cod_anagrafico:$9. ts_inizio_validita:datetime20.  ts_fine_validita:datetime20.;
datalines;
1 A 02JAN2015:00:00:00 01JAN5999:00:00:00
5 B 17MAY2017:00:00:00 01JAN5999:00:00:00
5 C 09JAN2022:00:00:00 01JAN5999:00:00:00
;



data T_A_SOGGETTI_DN;
input cod_source:$2. cod_anagrafico:$9. cod_anagrafico_edwh:$20. ts_inizio_validita:datetime20.  ts_fine_validita:datetime20.;
datalines;
1 A AAA 02JAN2015:00:00:00 01JAN5999:00:00:00
;


   proc sql noprint;
   create table ruolo_danni_NEW
   as select RU.*
			,SO.cod_anagrafico_EDWH
  from      RUOLO_DANNI RU

   left join   T_A_SOGGETTI_DN SO
   on        
             RU.cod_anagrafico = SO.cod_anagrafico
             and ru.ts_inizio_validita between so.ts_inizio_validita and so.ts_fine_validita
             and compress(SO.cod_source)='1';
quit;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Wed, 26 Apr 2023 06:01:46 GMT</pubDate>
    <dc:creator>mariopellegrini</dc:creator>
    <dc:date>2023-04-26T06:01:46Z</dc:date>
    <item>
      <title>defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872121#M344554</link>
      <description>&lt;P&gt;I should transform a proc sql join into a hash, but I'm having trouble because I don't know how to define the "DefineKey" since there are various operations, not a single key to define.&lt;BR /&gt;this is the example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data RUOLO_DANNI;
input cod_source:$2. cod_anagrafico:$9. ts_inizio_validita:datetime20.  ts_fine_validita:datetime20.;
datalines;
1 A 02JAN2015:00:00:00 01JAN5999:00:00:00
5 B 17MAY2017:00:00:00 01JAN5999:00:00:00
5 C 09JAN2022:00:00:00 01JAN5999:00:00:00
;



data T_A_SOGGETTI_DN;
input cod_source:$2. cod_anagrafico:$9. cod_anagrafico_edwh:$20. ts_inizio_validita:datetime20.  ts_fine_validita:datetime20.;
datalines;
1 A AAA 02JAN2015:00:00:00 01JAN5999:00:00:00
;


   proc sql noprint;
   create table ruolo_danni_NEW
   as select RU.*
			,SO.cod_anagrafico_EDWH
  from      RUOLO_DANNI RU

   left join   T_A_SOGGETTI_DN SO
   on        
             RU.cod_anagrafico = SO.cod_anagrafico
             and ru.ts_inizio_validita between so.ts_inizio_validita and so.ts_fine_validita
             and compress(SO.cod_source)='1';
quit;

&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 26 Apr 2023 06:01:46 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872121#M344554</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-26T06:01:46Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872123#M344556</link>
      <description>&lt;P&gt;Is cod_anagrafico unique in dataset in t_a_soggetti_dn?&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 06:07:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872123#M344556</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-04-26T06:07:05Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872127#M344560</link>
      <description>&lt;P&gt;no because there is also cod_source&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 06:13:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872127#M344560</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-26T06:13:55Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872130#M344563</link>
      <description>&lt;P&gt;But you don't use that in your ON condition in the SQL? This would mean that you may get multiple observations in your SQL for a single obs in the "left" dataset.&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 06:19:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872130#M344563</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-04-26T06:19:24Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872148#M344570</link>
      <description>&lt;P&gt;no because there is the final expression &lt;EM&gt;and compress(SO.cod_source)='1'&lt;/EM&gt;, so you only take the cod_source = '1'&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 07:27:34 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872148#M344570</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-26T07:27:34Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872162#M344573</link>
      <description>&lt;P&gt;So within cod_source = '1', cod_anagrafico is unique?&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 08:50:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872162#M344573</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-04-26T08:50:04Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872172#M344576</link>
      <description>&lt;P&gt;yes&lt;/P&gt;</description>
      <pubDate>Wed, 26 Apr 2023 09:29:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872172#M344576</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-26T09:29:09Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872184#M344578</link>
      <description>&lt;P&gt;Then it should be&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ruolo_danni_NEW;
set ruolo_danni;
if _n_ = 1
then do;
  length ts_inizio_validita ts_fine_validita 8;
  declare hash so (dataset:"ta_soggetti_dn (where=(compress(cod_source)='1'))");
  so.definekey("cod_anagrafico");
  so.definedata("ts_inizio_validita","ts_fine_validita");
  so.definedone();
  call missing(ts_inizio_validita,ts_fine_validita);
end;
rc = so.find();
if rc = 0 and ts_inizio_validita le  ts_inizio_validita le ts_fine_validita;
drop rc ts_inizio_validita ts_fine_validita;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;LI-SPOILER&gt;
&lt;LI-SPOILER&gt;&amp;nbsp;&lt;/LI-SPOILER&gt;
&lt;/LI-SPOILER&gt;</description>
      <pubDate>Wed, 26 Apr 2023 09:51:17 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872184#M344578</guid>
      <dc:creator>Kurt_Bremser</dc:creator>
      <dc:date>2023-04-26T09:51:17Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872259#M344608</link>
      <description>&lt;P&gt;thanks Kurt_Bremser. for completeness I report the final code to obtain the same result of the proc sql;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data ruolo_danni_HASH;
set ruolo_danni;
if _n_ = 1
then do;
  length ts_inizio_validita ts_fine_validita 8;
  length cod_anagrafico_edwh $20.;
  declare hash so (dataset:"t_a_soggetti_dn (where=(compress(cod_source)='1'))");
  so.definekey("cod_anagrafico");
  so.definedata("cod_anagrafico_edwh","ts_inizio_validita","ts_fine_validita");
  so.definedone();
  call missing(cod_anagrafico_edwh, ts_inizio_validita,ts_fine_validita);
end;
rc = so.find();
if rc &amp;gt;= 0 and ts_inizio_validita le  ts_inizio_validita le ts_fine_validita;
drop rc ;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 26 Apr 2023 14:31:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872259#M344608</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-26T14:31:18Z</dc:date>
    </item>
    <item>
      <title>Re: defineKey in hash object join</title>
      <link>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872462#M344709</link>
      <description>&lt;P&gt;Kurt&amp;nbsp; I found some data inconsistencies between sql and hash, because the "ON" condition is different:&amp;nbsp;ts_start_validation is taken from the left dataset, while&amp;nbsp;ts_start_validation&amp;nbsp; ts_end_validation of the "beetween" are taken from the right dataset. This example explains the problem with a particular case ((the results of &lt;CODE class=" language-sas"&gt;ruolo_danni_sql &lt;/CODE&gt;and &lt;CODE class=" language-sas"&gt;ruolo_danni_hash&amp;nbsp;&lt;/CODE&gt;are different):&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data RUOLO_DANNI;
input cod_source:$2. cod_anagrafico:$9. ts_inizio_validita:datetime20.;
datalines;
1 21278 02JUL11:03:25:44
1 21278 02JUL11:03:25:45
1 21278 02JUL11:03:25:46
;
data T_A_SOGGETTI_DN;
input cod_source:$2. cod_anagrafico:$9. cod_anagrafico_edwh:$20. ts_inizio_validita:datetime20.  ts_fine_validita:datetime20.;
datalines;
1 21278 F_SCDDNL64D45Z133D 01JUL2011:11:15:02 01JUL2011:11:15:01
;
proc sql noprint;
create table ruolo_danni_sql as 
select RU.cod_anagrafico,
       RU.ts_inizio_validita,
	   RU.cod_source,
	   SO.cod_anagrafico_edwh
from RUOLO_DANNI RU
left join   T_A_SOGGETTI_DN SO
on      RU.cod_anagrafico = SO.cod_anagrafico
    and ru.ts_inizio_validita between so.ts_inizio_validita and so.ts_fine_validita
    and compress(SO.cod_source)='1';
quit;
data ruolo_danni_HASH;
set ruolo_danni;
if _n_ = 1
then do;
  length ts_inizio_validita ts_fine_validita 8;
  length cod_anagrafico_edwh $20.;
  declare hash so (dataset:"t_a_soggetti_dn (where=(compress(cod_source)='1'))");
  so.definekey("cod_anagrafico");
  so.definedata("cod_anagrafico_edwh","ts_inizio_validita","ts_fine_validita");
  so.definedone();
  call missing(cod_anagrafico_edwh, ts_inizio_validita,ts_fine_validita);
end;
rc = so.find();
if rc &amp;gt;= 0 and ts_inizio_validita le ts_inizio_validita le ts_fine_validita;
drop rc ;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 27 Apr 2023 09:04:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/defineKey-in-hash-object-join/m-p/872462#M344709</guid>
      <dc:creator>mariopellegrini</dc:creator>
      <dc:date>2023-04-27T09:04:12Z</dc:date>
    </item>
  </channel>
</rss>

