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

时间:2016-03-11 18:35:14

标签: kdb q-lang

我在Q中的JDBC连接中有下表。

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

如何对表格中的列应用偏差?看来我的方法不起作用:

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
---------

2 个答案:

答案 0 :(得分:4)

如果结果是原子,则需要登记结果,因为表列必须是列表,而不是原子。通常,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然后求和

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

以上是最大整数。添加一个为int提供无穷大

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

添加更多内容显示空白(null)

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

解决方案是在求和之前投入很长时间(或者首先使它们变长)

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

答案 1 :(得分:0)

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

deviation t`some_id

否则,如果您想要保留一个表作为答案,如果您要获得结果:

select enlist deviation some_id from t