在q kdb

时间:2019-11-14 09:00:34

标签: kdb

我们有一个下表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

2 个答案:

答案 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)
相关问题