SQL语句(SAS)中的交叉连接问题

时间:2015-04-20 21:35:44

标签: sql sas cross-join

有人可以向我解释为什么坚持在加入时做笛卡尔积?对我来说,使用索引似乎是合乎逻辑的。有没有办法强制它使用索引(你可以看到我已经尝试过,但它忽略了我的idxname语句。)

以下示例是我可以重现我遇到的问题的最简单方法,而不是我的实际代码。

创建一些测试数据:

data all_periods;
  do date=mdy(1,1,2015) to mdy(4,1,2015);
    do hour=0 to 23;
      do minute=0 to 59; 
        period_start = dhms(date,hour,minute,0);
        output;
      end;
    end;
  end;
run;

在测试数据上创建索引:

proc sql noprint;
  create index period_start on all_periods;
quit;

执行自我加入:

proc sql noprint _method;
  create table concurrent as 
  select a.period_start,
         count(*) as result
  from all_periods a
  join all_periods (idxname=period_start) b on b.period_start lt a.period_start
  group by 1
  ;
quit;

1 个答案:

答案 0 :(得分:2)

非等值连词通常不使用索引。我实际上建议您使用retain在数据步骤中执行此操作。但是,您可以在proc sql中尝试此版本:

select a.period_start,
       (select count(*)
        from all_periods b
        where b.period_start < a.period_start
       ) as result
from all_periods a;

大多数数据库都使用窗口函数内置累积和。但是,SAS本身不支持这些。因此,proc sql不是进行此计算的最佳方式。