【问题标题】:function return a table in kdb/q函数返回 kdb/q 中的表
【发布时间】:2018-06-29 15:43:29
【问题描述】:

我是 kdb/q 的新手,对 kdb\q 函数不熟悉,希望有人能帮助我。这是问题: 我有一个简单的 q 函数声明如下:

func:{[x;y] x+y}

{[x;y] x+y}[3;4] 给了我答案7。一切正常。

如果我有一个表 t 有两列,例如:

_x   _y
--------
3     4
2     5
6     2
...

我能否在 q 中有一个函数,以便为 tablet 的每一行计算 x+y? 我的预期回报是这样的:

res
---
7
7
8
...

非常感谢!

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您可以将列名作为参数传递给函数:

    q)tab:([]x:1 2 3;y:4 5 6)
    q)func:{[x;y] x+y}
    q)
    q)select res:func[x;y]from tab
    res
    ---
    5
    7
    9
    

    或者,您可以使用函数形式将该查询转换为函数:

    q){?[x;();0b;enlist[`res]!enlist(`func;y;z)]}[tab;`x;`y]
    res
    ---
    5
    7
    9
    

    【讨论】:

    • 太棒了!你能给我解释一下第二种选择吗>?我不太明白..
    • 它与选择的功能形式一起工作,在on the wiki 中有详细的描述。要查看查询的功能形式,您可以运行parse"select res:func[x;y]from tab",它将输出构成查询所需的 4 个参数。
    • 非常感谢!另一个快速的问题:我有一个函数 func:{[id;time] select last synp from synp_t where instr_id = id, tp_time < time} ;但是当我运行func[8 1;05:01:06 05:06:01] 时,它给了我'长度错误..你知道我错在哪里..?
    【解决方案2】:

    由于 + 被重载以同时使用 atom 和 list ,res:func[x;y] 将完全正常工作;但是,如果二元函数只接受作为原子而不是列表的参数,那么each-both 就可以解决问题:

    q)select res:func'[x;y] from tab  // using each-both func'[x;y]
    res
    ---
    5
    7
    9
    

    例如,从列 s 中选择与 c 一样多的字符

    tab2:([] c:1 2 3;s:("123";"1234";"123456"))
    q)update res:#'[c;s] from tab2  //func'[x;y]
    c   s         res
    -----------------------
    1   "123"     enlist "1"
    2   "1234"    "12"
    3   "123456"  "123"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多