我们有一个下表t
q)t:([] sym:10?`GOOG`AMZN`IBM; px:10?100.; size:10?1000; mkt:10?`ab`cd`ef)
我们的要求是,如果“ mkt”列的值为“ ef”,则按“ sym”列对表“ t”进行“分组”,对于其余市场(“ ab” cd”),我们需要所有值(不分组)。 对于这种用例,我在下面编写了查询,该查询按预期工作,
q)(select px, size, sym, mkt from select by sym from t where mkt=`ef), select px, size, sym, mkt from t where mkt in `ab`cd
请帮助我以一种方式优化上述查询
sudo code -
if mkt=`ef:
then use group by on table
else if mkt in `ab`cd
don't use group by on table
答案 0 :(得分:5)
我发现与您提供的查询方法不同的两种查询方法。
您可以使用以下查询在一个select语句中完成所需的操作:
select from t where (mkt<>`ef)|(mkt=`ef)&i=(last;i)fby ([]sym;mkt)
但是,如果您比较它的速度:
q)\t:1000 select from t where (mkt<>`ef)|(mkt=`ef)&i=(last;i)fby ([]sym;mkt)
68
原始查询:
q)\t:1000 (select px, size, sym, mkt from select by sym from t where mkt=`ef), select px, size, sym, mkt from t where mkt in `ab`cd
40
您可以看到查询速度更快。
此外,您可以尝试执行此操作,而无需明确声明您不想按符号分组的每个mkt
(0!select by sym from t where mkt=`ef),select from t where mkt<>`ef
但这又以与原始解决方案相同的速度结束了:
q)\t:1000 (0!select by sym from t where mkt=`ef),select from t where mkt<>`ef
42
因此,在优化方面,您的查询似乎可以很好地满足您的要求。
答案 1 :(得分:2)
这也没有更快(正如罗伯所说,您的查询在速度方面已经很好),但至少要短一些
delete x from select by sym,(1+i)*`ef<>mkt from t
...只要您不介意更改顺序。
fby形式
select from t where i=(last;i)fby([]sym;(1+i)*`ef<>mkt)