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

kdb+: function with two arguments from columns

我有一个函数可以处理日期,还有一个函数需要两个参数来执行计算。现在让我们假设它们如下所示:

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.

I've also tried select f ./: (columnOne,'d[columnTwo]) from myTable, which also doesn't work.

您已经非常接近该代码了。问题是 d 函数,特别是函数 d 中的 x.hh - .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 因此您可以在结果 table 中看到其他列)

实现相同的其他语法:

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]d each columnTwo(或 d'[columnTwo]

这将导致以下查询之一:

select res:f'[columnOne;d'[columnTwo]] from myTable
select res:f ./: (columnOne,'d each columnTwo) from myTable
select res:f ./: (columnOne,'d'[columnTwo]) from myTable