【问题标题】:KDB/Q: How to write a function for select byKDB/Q:如何为 select by 编写函数
【发布时间】:2020-10-29 17:27:27
【问题描述】:

我们知道我们可以写一个类似的函数

select avg val by category from tab

但是如果我需要编写复杂的自定义函数,比如

select myfunc by category from tab

此处 myfund 将使用选项卡中的多个列进行计算。例如在 myfunc 中,我可能会进行另一层选择,可能会进行一些过滤等。作为一个基本示例,我如何在a+b+c+d 下方进行包装

select a+b+c+d by category from tab

在 myfunc 内部,它可以看到列 a、b、c 和 d,并且会对它们进行一些操作?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    你可以很容易地用你自己的函数替换 avg,如下所示:

    select {[a;b;c;d]a+b+c+d}[a;b;c;d] by category from tab

    如果您想逐行执行,请使用 each-both '

    select {[a;b;c;d]a+b+c+d} ' [a;b;c;d] by category from tab

    您能否提供一个示例,说明您试图通过函数内部的附加 by/filtering 实现什么?在我看来,这不是最好的方法

    【讨论】:

    • 其实我给了它更多的想法。我想你是对的。更好的方法是取消透视表以将列放入行并从那里进行选择。不过你的回答很有帮助!
    【解决方案2】:

    您可以将列以表格格式传递到您的函数中,例如:

    q)t:([]col1:10?`a`b`c;col2:10?10;col3:10?1f;col4:10?.z.D)
    q)select {break}[([]col2;col3;col4)] by col1 from t
    'break
      [1]  {break}
              ^
    q))x
    col2 col3      col4
    -------------------------
    9    0.5785203 2008.02.04
    7    0.1959907 2003.07.05
    8    0.6919531 2007.12.27
    

    如果您要使用函数内的所有列,那么另一种方法是将表分组为子表并为每个子表运行一个函数:

    func each t group t`col1
    

    【讨论】:

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