我正在解决 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
Run Code Online (Sandbox Code Playgroud)
当我申请 fby 时:
select from tr where price=(max;price) fby sym
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
但是,正如我们所看到的,我进行了两次 sym GOOG 交易,因为最高价格是相同的。因此,现在我想获得每个符号的输出以及每个符号的最后交易时间(以及最大价格)。所以,我使用下面的查询
select from (select from tr where price=(max;price) fby sym) where time=(last;time) fby sym
Run Code Online (Sandbox Code Playgroud)
获取输出:
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
Run Code Online (Sandbox Code Playgroud)
有没有更好/优化的方法来编写上面的查询而不使用 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
Run Code Online (Sandbox Code Playgroud)