如何将函数应用于整个列?

How to apply a function to an entire column?

我从 Q 中的 JDBC 连接获得以下 table。

q)r
some_int this              created_at                    updated_at          ..
    -----------------------------------------------------------------------------..
1231231    "ASD" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29...
13312    "TSM" 2016.02.11D14:16:29.743260000 2016.02.11D14:16:29...

我想将以下函数应用于第一列。

deviation:{a:avg x; sqrt avg (x*x)-a*a}

这适用于数组。

q)l
1 2 3 4
q)deviation l
1.118034

如何在 table 中的列上应用偏差?看来我的方法不行:

q)select deviation(some_id) from r
'rank

更新:

我无法解释以下内容:

q)select avg(some_int) from r
some_int
---------
1005341
q)select min(some_int) from r
some_int
---------
812361
q)select max(some_int) from r
some_int
---------
1184014
q)select sum(some_int) from r
some_int
---------

如果结果是原子,则需要获取结果,因为 table 列必须是列表,而不是原子。通常 kdb 可以为您做这件事,但当您执行自己的自定义聚合时通常不会。例如,即使您将函数 sum2 定义为 sum:

的精确副本
q)sum2:sum

kdb 只能将 sum 识别为聚合并自动登记,但不能识别 sum2

q)select sum col1 from ([]col1:1 2 3 4)
col1
----
10

q)select sum2 col1 from ([]col1:1 2 3 4)
'rank

所以第二种情况需要入伍:

q)select enlist sum2 col1 from ([]col1:1 2 3 4)
col1
----
10

更新:

回答您的第二个问题 - 看起来您的数字总和超出了整数的边界。您需要将它们转换为 long 然后 sum

q)select sum col1 from ([]col1:2147483645 1i)
col1
----------
2147483646

以上是最大整数。再加一个 int

的无穷大
q)select sum col1 from ([]col1:2147483645 1 1i)
col1
----
0W

添加超出此范围的任何内容都会显示空白(空)

q)select sum col1 from ([]col1:2147483645 1 1 1i)
col1
----

解决方案是在求和之前转换为 long(或者首先将它们设为 long)

q)select sum `long$col1 from ([]col1:2147483645 1 1 1i)
col1
----------
2147483648

您获得排名是因为该函数没有 return 列表。由于函数 return 是一个数字,所以您可能只想要一个数字答案?在这种情况下,您可以简单地索引到 table(或使用 exec)来获取列向量并应用它:

deviation t`some_id

否则,如果你想保留一个 table 作为答案,如果你征集了结果:

select enlist deviation some_id from t