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