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

Cross-join issue in SQL statement (SAS)

任何人都可以向我解释为什么这坚持在连接上做笛卡尔积吗?对我来说,使用索引似乎是合乎逻辑的。有没有办法强制它使用索引(你可以看到我已经尝试过但它忽略了我的 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;

非等值连接通常不使用索引。实际上,我建议您使用 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;

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