我有一个函数,它使用一个日期和一个带有两个参数来执行计算的函数。现在让我们假设他们看起来如下:
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
。
答案 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]