kdb +:来自列的两个参数的函数

时间:2015-03-27 22:16:58

标签: kdb

我有一个函数,它使用一个日期和一个带有两个参数来执行计算的函数。现在让我们假设他们看起来如下:

d:{[x] :x.hh}
f:{[x;y] :x+y}

现在我想在查询中使用函数f,如下所示:

select f each (columnOne,d[columnTwo]) from myTable

因此,我首先想要使用函数d将一列转换为相应的数字。然后,使用columnOned[columnTwo]的输出,我想计算f的结果。

显然,上述方法不起作用,因为它失败并出现'rank错误。

我也试过了select f ./: (columnOne,'d[columnTwo]) from myTable,这也没有用。

我该怎么做?请注意,我需要将columnOnecolumnTwo输入f,以便相应的行仍然匹配。例如。将columnOne的第1行和columnTwo的第1行同时输入f

1 个答案:

答案 0 :(得分:2)

  

我也试过了select f ./: (columnOne,'d[columnTwo]) from myTable,这也行不通。

你非常接近该代码。问题是d函数,特别是函数x.hh中的d - .hh符号在此上下文中不起作用,您需要执行{`hh$x相反,所以d变为:

d:{[x] :`hh$x}

因此,只对上述代码进行此更改,我们得到:

q)d:{[x] :`hh$x}
q)f:{[x;y] :x+y}
q)myTable:([] columnOne:10?5; columnTwo:10?.z.t);
q)update res:f ./: (columnOne,'d[columnTwo]) from myTable
    columnOne columnTwo    res
    --------------------------
    1         21:10:45.900 22
    0         20:23:25.800 20
    2         19:03:52.074 21
    4         00:29:38.945 4
    1         04:30:47.898 5
    2         04:07:38.923 6
    0         06:22:45.093 6
    1         19:06:46.591 20
    1         10:07:47.382 11
    2         00:45:40.134 2

(我已将select更改为update,因此您可以在结果表中看到其他列。

实现相同的其他语法:

q)update res:f'[columnOne;d columnTwo] from myTable
    columnOne columnTwo    res
    --------------------------
    1         21:10:45.900 22
    0         20:23:25.800 20
    2         19:03:52.074 21
    4         00:29:38.945 4
    1         04:30:47.898 5
    2         04:07:38.923 6
    0         06:22:45.093 6
    1         19:06:46.591 20
    1         10:07:47.382 11
    2         00:45:40.134 2

只有其他注意事项 - 在上面的示例中,函数d是矢量化的(与矢量arg一起使用),如果不是这种情况,则需要将d[columnTwo]更改为{ {1}}(或d each columnTwo

这将导致以下查询之一:

d'[columnTwo]