Как эффективно преобразовать выходные данные одной функции KDB в три столбца таблицы? - PullRequest
1 голос
/ 07 октября 2019

У меня есть функция, которая принимает в качестве входных данных некоторые значения в таблице и возвращает кортеж, если хотите, - три отдельных возвращаемых значения, которые я хочу перенести в вывод запроса. Вот упрощенный пример того, чего я хочу достичь:

multiplier:{(x*2;x*3;x*3)};
select twoX:multiplier[price][0]; threeX:multiplier[price][1]; fourX:multiplier[price][2] from data;

Вышеописанное в основном работает (я думаю, что у меня есть правильный синтаксис для упрощенного примера - если нет, то, надеюсь, мое намерение ясно), нонеэффективно, потому что я вызываю функцию три раза и выбрасываю большую часть выходных данных каждый раз. Я хочу переписать запрос, чтобы вызвать функцию только один раз, и я изо всех сил.

Обновление

Мне кажется, я упустил важную информацию в своем объяснении проблемы, которая влияет нарезультат - мне нужно получить другие данные в запросе наряду с выводом моей функции. Вот, надеюсь, более реалистичный пример:

multiplier:{(x*2;x*3;x*4)};
select average:avg price, total:sum price, twoX:multiplier[sum price][0]; threeX:multiplier[sum price][1]; fourX:multiplier[sum price][2] by category from data;

Я попробую адаптировать ваши ответы, чтобы они соответствовали этому требованию, и приношу извинения за то, что упустил эту информацию. Реальная функция, если собственный и довольно сложный алгоритм и реальный запрос имеет около 30 выходных столбцов, поэтому попытка упростить пример:)

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

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

q)exec flip`twoX`threeX`fourX!multiplier[price] from ([]price:til 10)
twoX threeX fourX
-----------------
0    0      0
2    3      4
4    6      8
6    9      12
8    12     16
10   15     20
12   18     24
14   21     28
16   24     32
18   27     36

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

q)t:([]price:til 10)
q)t,'exec flip`twoX`threeX`fourX!multiplier[price] from t
1 голос
/ 07 октября 2019

Заявка @ также может достичь того, что вы хотите. Здесь data - это просто таблица с 10 случайными ценами. @ затем используется для применения функции multiplier к столбцу price при назначении имени столбца для каждого из трех результирующих списков:

q)data:([] price:10?100)
q)multiplier:{(x*2;x*3;x*3)}
q)@[data;`twoX`threeX`fourX;:;multiplier data`price]
price twoX threeX fourX
-----------------------
80    160  240    240
24    48   72     72
41    82   123    123
0     0    0      0
81    162  243    243
10    20   30     30
36    72   108    108
36    72   108    108
16    32   48     48
17    34   51     51
...