有人可以向我解释为什么坚持在加入时做笛卡尔积?对我来说,使用索引似乎是合乎逻辑的。有没有办法强制它使用索引(你可以看到我已经尝试过,但它忽略了我的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;
答案 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
不是进行此计算的最佳方式。