【问题标题】:kdb+: function with two arguments from columnskdb+:具有来自列的两个参数的函数
【发布时间】:2015-03-27 22:16:57
【问题描述】:

我有一个处理日期的函数和一个接受两个参数来执行计算的函数。现在让我们假设它们如下所示:

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

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

    您与该代码非常接近。问题是 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,因此您可以看到结果表中的其他列)

    实现相同的其他语法:

    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 函数做了其他事情。我刚刚为这个问题做了.hh。但这似乎很有帮助。谢谢!
    • 现在我想起来了,我的fd 函数可能不是基于向量的。因此两者都需要某种each 作为输入。那么语法将如何工作?提前谢谢你:)
    • 没关系,我自己找到了语法(我已经用一些示例查询更新了你的答案)。和你提议的一样。再次感谢:)
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多