KDB : эффективный метод преобразования двухэтапного запроса в одноэтапный запрос?

#kdb

#kdb

Вопрос:

Я хотел бы преобразовать следующий запрос в один запрос

 tab:([price:til 10]side:10?-1 1;qty:990   2 * til 10);


a:select[>price] from tab where side=1;
b:select from a where sums[qty] <= max(min[sums qty];100);
 

или

 select from (select[>price] from tab where side=1) where sums[qty] <= max(min[sums qty];100);
 

Я попытался реализовать оператор select с помощью fby следующим образом:

 select from tab where side=-1, ({sy:sums[y]; sy<=max(min[sy];x)}[100];qty) fby side
 

Однако это не сортирует таблицу tab правильно, т. Е. в соответствии с >price .
Я полагаю, можно было бы предварительно отсортировать таблицу, т.е.

 select from `price xasc tab ...  
 

Однако это может показаться вычислительно неэффективным решением. Не мог бы какой-нибудь мудрый Q God, пожалуйста, посоветовать мне, как наиболее эффективно достичь этого.
Спасибо, с наилучшими пожеланиями

Ответ №1:

Если таблицу необходимо отсортировать в порядке убывания в соответствии с ценой для sums qty расчета, то использование xdesc или desc кажется неизбежным шагом.

Это самая краткая версия вашего запроса, которую я смог найти.

 select from desc tab where side=1,sums[qty]<=max(min sums qty;100)
 

Ответ №2:

Я изо всех сил пытаюсь понять, почему вы выполняете вычисления таким образом. Сортировка будет иметь влияние, поскольку она повлияет на то, какое значение будет первым, прежде чем величины будут постепенно увеличиваться с суммами. Есть ли причина, по которой вы не используете что-то подобное:

 q)select from tab where qty = max qty
price| side qty
-----| ---------
9    | 1    1008
q)select from tab where qty = (max;qty) fby side
price| side qty
-----| ---------
8    | -1   1006
9    | 1    1008