在 q kdb 的特定条件下使用 group by 优化查询

Optimize the query using group by on certain condition in q kdb

我们有一个 table t 如下

q)t:([] sym:10?`GOOG`AMZN`IBM; px:10?100.; size:10?1000; mkt:10?`ab`cd`ef)

我们的要求是 'group by' table 't' by column 'sym' if column 'mkt' value is 'ef', for rest of市场('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

我发现了两种不同的查询方式,与您提供的方式不同。

您可以使用以下查询在一个 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

您可以看到您的查询速度更快了。

此外,您可以试试这个,它不需要明确说明您不希望按 sym 分组的 t 中的每个 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

因此,就优化而言,您的查询似乎可以很好地满足您的要求。

这也没有更快(正如 Rob 所说,您的查询在速度方面已经很好),但至少更短

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)