我在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
---------
答案 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