如何有效地将一个KDB函数的输出转换为三个表列?

如何有效地将一个KDB函数的输出转换为三个表列?,kdb,Kdb,我有一个函数,它将表中的一些值作为输入,并返回一个元组(如果愿意的话)——三个单独的返回值,我想将它们转换为查询的输出。下面是我想要实现的一个简化示例: 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*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;

无论如何,我将尝试调整您的答案以满足这一要求,并为遗漏这一点信息表示歉意。如果real函数是一个专有且相当复杂的算法,那么real查询有大约30个输出列,因此尝试简化示例:

如果您只是查找结果本身,则可以提取exec as列表,创建字典,然后将字典翻转到表中:

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
如果您也需要原始表中的其他列,那么它就更复杂了,但是您可以使用


如果只是查找结果本身,可以将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
如果您也需要原始表中的其他列,那么它就更复杂了,但是您可以使用

一个apply@也可以实现你想要的。这里的数据只是一个包含10个随机价格的表格。@然后用于将乘数函数应用于价格列,同时为三个结果列表中的每一个指定列名:

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
一个apply@也可以实现你想要的。这里的数据只是一个包含10个随机价格的表格。@然后用于将乘数函数应用于价格列,同时为三个结果列表中的每一个指定列名:

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

正如我在更新中提到的,我需要在我的查询中提取额外的列数据,很抱歉在我对问题的定义中遗漏了这些数据,并且在翻转的左侧添加价格(例如)会阻止翻转创建输出中显示的列。啊,我的错,我错过了您更新答案的消息。是的,这个很好用,非常感谢!正如我在更新中提到的,我需要在我的查询中提取额外的列数据,很抱歉在我对问题的定义中遗漏了这些数据,并且在翻转的左侧添加价格(例如)会阻止翻转创建输出中显示的列。啊,我的错,我错过了您更新答案的消息。是的,这个很好用,非常感谢!这似乎更接近我的目标,因为输出包括价格,但考虑到这一点,我有点被限制使用select语句,因为我的代码到处都在使用select语法,目前只是从算法中提取一个值。我引入的变化是算法返回第二个和第三个值,我需要将其映射到列中,但实际上将算法重构为三个算法要比更改每个消费点更容易。这似乎更接近我的目标,因为输出包括价格,但是考虑到这一点,我有点被限制使用select语句,因为我的代码到处都是已经使用select语法的代码,目前只是从算法中提取一个值。我要介绍的更改是算法返回第二个和第三个值,我需要将其映射到列中,但实际上,将算法重构为三个算法要比更改每个消耗点更容易。