如何将函数应用于整个列?
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
我从 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