KDB / Q:如何编写用于选择的功能

问题描述

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

select avg val by category from tab

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

)怎么办
select myfunc by category from tab

在这里,myfund将在选项卡中包含多个列的情况下进行计算。例如在myfunc内部,我可能会做另一层select by,可能会进行一些过滤等。作为一个基本示例,如何包装a + b + c + d

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

在myfunc内,它对a,b,c,d列具有可见性,并将对其进行一些处理吗?

解决方法

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

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
,

您可以使用自己的函数轻松替换avg,如下所示:

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

如果要逐行执行,请同时使用'

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...