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
将一列转换为相应的数字。然后,同时使用 columnOne
和 d[columnTwo]
的输出,我想计算 f
.
的结果
显然,上述方法不起作用,因为它失败并出现 'rank
错误。
我也试过select f ./: (columnOne,'d[columnTwo]) from myTable
,还是不行。
我该怎么做?请注意,我需要将 columnOne
和 columnTwo
输入到 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
我有一个函数可以处理日期,还有一个函数需要两个参数来执行计算。现在让我们假设它们如下所示:
d:{[x] :x.hh}
f:{[x;y] :x+y}
现在我想在查询中使用函数 f
,如下所示:
select f each (columnOne,d[columnTwo]) from myTable
因此,我首先想使用函数d
将一列转换为相应的数字。然后,同时使用 columnOne
和 d[columnTwo]
的输出,我想计算 f
.
显然,上述方法不起作用,因为它失败并出现 'rank
错误。
我也试过select f ./: (columnOne,'d[columnTwo]) from myTable
,还是不行。
我该怎么做?请注意,我需要将 columnOne
和 columnTwo
输入到 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