在q kdb中使用select / fby两次优化查询

时间:2019-06-05 04:58:51

标签: kdb

我正在解决fby的经典问题,以便从交易表中找到每个交易品种的最高价格。
表格:tr

time                          sym  src price size
-------------------------------------------------
2019.03.11D09:00:00.277000000 GOOG L   36.01 1427
2019.03.11D09:00:04.123000000 GOOG O   36.01 708
2019.03.11D09:00:08.123000000 MSFT N   35.5  7810
2019.03.11D09:00:10.123000000 MSFT O   31.1  1100

当我应用fby时:

select from tr where price=(max;price) fby sym

输出为:

time                          sym  src price size
-------------------------------------------------
2019.03.11D09:00:00.277000000 GOOG L   36.01 1427
2019.03.11D09:00:04.123000000 GOOG O   36.01 708
2019.03.11D09:00:08.123000000 MSFT N   35.5  7810

但是,正如我们所看到的,由于最高价格相同,因此我两次获得了GOOG符号交易。因此,现在我想获得每个符号的输出以及每个符号的最后交易时间(以及最大价格)。 所以,我在下面使用查询

select from (select from tr where price=(max;price) fby sym) where time=(last;time) fby sym

获取输出:

time                          sym  src price size
-------------------------------------------------
2019.03.11D09:00:04.123000000 GOOG O   36.01 708
2019.03.11D09:00:08.123000000 MSFT N   35.5  7810

是否有更好的/优化的方法来编写两次使用select / fby的查询?

2 个答案:

答案 0 :(得分:3)

您可以在where子句中两次使用fby。还考虑到where子句是级联的事实,因此,如果正确地对它们进行排序,将获得所需的结果:

q)t:([]time:09:00 09:04 09:08 09:10;sym:`g`g`m`m;price:36.01 36.01 35.5 31.01)
q)select from t where price=(max;price) fby sym,time=(max;time) fby sym
time  sym price
---------------
09:04 g   36.01
09:08 m   35.5

答案 1 :(得分:2)

第二个where子句中的轻微优化将对第一个约束的简化集合进行操作:

select from tr where price=(max;price) fby sym, time=(last;time) fby sym

否则(尚未计时)“选择依据”具有相同的行为,并且可能更快:

select by sym from tr where price=(max;price) fby sym