Оптимизируйте запрос с помощью select / fby дважды в q kdb - PullRequest
3 голосов
/ 05 июня 2019

Я решаю классическую проблему fby, чтобы найти максимальную цену за символ из торговой таблицы.
table: 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 сделку дважды, так как максимальная цена одинакова.Следовательно, теперь я хочу получить вывод за sym с последним временем торговли каждого символа (вместе с максимальной ценой).Итак, я использую запрос ниже

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 ]

3 голосов
/ 05 июня 2019

Вы можете использовать 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
2 голосов
/ 05 июня 2019

Небольшая оптимизация в ту секунду, когда предложение будет работать на сокращенном наборе первого ограничения:

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
...