sql - PROC SQL 之间的哈希连接等价物

标签 sql join hash sas between

我通常使用 PROC SQL 来加入一个表,该表也有日期条件(即 target_date 介于 start_date 之间)和 end_date)。

在考虑 INNER JOIN 时,我已经能够成功地将其转换为散列连接:

data hash_join;
if _n_ = 1 then do;
    declare hash add1(dataset:'table_2',multidata: 'Y');
    add1.defineKey('key_1');
    add1.defineData('start_date','end_date','value_1');
    add1.defineDone();
end;

format 
    start_date date9.
    end_date date9.
    value_1 10.5
;

set table_1 (keep=key_1 target_date);

if add1.find() = 0 then do until (add1.find_next());
    if start_date le target_date le end_date then output;
end;
run;

这与以下内容相同:

proc sql;
create table sql_join as select
b.start_date,
b.end_date,
b.value_1,
a.key_1,
a.target_date
from table_1 a
inner join table_2 b
on  a.key_1 = b.key_1 and
a.target_date between b.start_date and b.end_date
;quit;

虽然我无法弄清楚什么是 LEFT JOIN 的等价物。 例如,如果没有JOIN,我想输出,我认为这很简单:

if add1.find() ne 0 then output;

如果 JOIN 并且日期介于两者之间,那看起来也很简单:

if add1.find() = 0 then do until (add1.find_next());
    if start_date le target_date le end_date then output;
end;

但是我如何从 table_1 中获取可能加入的其余记录,但在 start_dateend_datetarget_date? 例如,假设 table_2 是一个销售的 start_dateend_date,并且该销售没有开始key_1 = 'Clothes' 到 2 月 1 日。如果我的 table_1 在 1 月 1 日有 'Clothes' 和 sales,它会在键上 JOIN,但我想输出空白值。关于如何执行此操作的任何想法?

如有任何帮助,我们将不胜感激!

最佳答案

您只需要跟踪是否找到了匹配项。由于您没有使用散列查找来跟踪事物的“中间”部分,因此您不能使用它,所以您只能自己做。

请参阅此示例。在这里,我将 SASHELP.CLASS 修改为看起来像您的输入表,然后添加一些逻辑以查看是否找到任何内容。

data table_1;
  set sashelp.class;
  rename age=target_date name=key_1;
  drop height weight;
run;

data table_2;
  set sashelp.class;
  do _i = 1 to mod(_n_,3);
    start_date = age-3+_i;
    end_date = age+1-_i;
    if start_date le end_date then output;
  end;
  rename name=key_1 height=value_1;
  keep height weight start_date age end_date name;
run;

data hash_join;
if _n_ = 1 then do;
    declare hash add1(dataset:'table_2',multidata: 'Y');
    add1.defineKey('key_1');
    add1.defineData('start_date','end_date','value_1');
    add1.defineDone();
end;

format 
    start_date date9.
    end_date date9.
    value_1 10.5
;

set table_1 (keep=key_1 target_date);

if add1.find() = 0 then do until (add1.find_next());
    if start_date le target_date le end_date then do;
      found=1;
      output;
    end;
end;
call missing(of value_1);  *full list of values to clear - all of hash data elements;
if not (found) then output;
run;

关于sql - PROC SQL 之间的哈希连接等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187746/

相关文章:

hash - Microsoft 符号服务器/本地缓存哈希算法

c++ - 是否可以将哈希值作为编译时常量获取?

php - 如何在数据库中存储用户计算机名?

sql - 生成随机数量的子记录

php - Zend 框架 2 : how to get columns from joined tables?

mysql - 计算列上的内连接

mysql - 连接多行

python - 如何仅使用一次传递创建文件的多个哈希值?

mysql - 具有动态列的 SQL 查询 (PIVOT)

SQL-从左连接中删除重复项