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

标签 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

但是,正如我们所看到的,我得到了 sym 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?

最佳答案

您可以在 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

关于kdb - 在 q kdb 中使用 select/fby 两次优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56454450/

相关文章:

haskell - 如何在 Haskell 中对这种递归结构进行建模?

KDB Apply where phrase only if column exists

python - 如何在 Mac OS 64 位上安装 32 位 pyq,适用于 python 3.6-32

html - 如何在 html5 的表格中突出显示/更改颜色到特定单词?

kdb - Q 中的模量行为

kdb - 在q kdb中获取上一季度的最后一个工作日和第一个工作日(工作日)

kdb - 为什么 kdb 进程在系统上显示高内存使用率?

python - qPython - kdb响应数据的类型转换

sql - KDB 的 Case When 语句

aggregate - KDB:用户定义的表聚合函数