Передача имени столбца в качестве аргумента для запроса выбора KDB? - PullRequest
0 голосов
/ 31 мая 2019

Я хотел бы передать имя столбца в функцию Q для запроса загруженной таблицы.

Пример:

getDistinct:{[x] select count x from raw}
getDistinct "HEADER"

Это не работает, так как документация Q говорит, что я не могупередать столбец в качестве аргументов.Есть ли способ обойти это?

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

Когда q интерпретирует x, он будет обрабатывать его как строку, он не имеет ссылки на столбец, поэтому ваш вывод будет просто считать "HEADER".

Если вы хотите передать столбец в виде строки, вам нужно построить весь оператор выбора, а затем использовать значение

{value "select count  ",x," from tab"} "HEADER"

Однако рекомендуемый метод будетчтобы использовать , выберите .Ниже я использую parse для построения эквивалента функционального выбора, используя дерево разбора.

/Create sample table
tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f)

/Generate my parse tree to get my functional form
.Q.s parse "select count i by inst from tab"

/Build this into my function
{?[`tab;();(enlist x)!enlist x;(enlist `countDistinct)!enlist (#:;`i)]} `inst

Обратите внимание, что вы должны передать столбец как символ.Кроме того, #: i является просто k-эквивалентом для подсчета i.

Обновление для нескольких столбцов

tab:([]inst:10?`MSFT`GOOG`AAPL;time:10?.z.p;price:10?10f;cntr:10`HK`SG`UK`US)
{?[`tab;();(x)!x;(enlist `countDistinct)!enlist (#:;`i)]} `inst`cntr
0 голосов
/ 31 мая 2019

Чтобы получить функциональную форму оператора select, я рекомендую использовать buildSelect .Кроме того, уменьшите область скобок, т.е. используйте enlist[`countDistinct] вместо (enlist `countDistinct).

...