我创建了自己的四舍五入函数:
.q.rnd:{$[x < 0; -1; 1] * floor abs[x] + 0.5}
我有一个表Test,其中的COL字符串列为
select "F"$(COL) from Test
24549.18741328
48939.50717263
-274853.33568872
-24549.18741328
298753.62574861
84822.70074144
-7468840.64371524
117944.21228603
-117944.21228603
7468840.64371524
-7468840.64371524
我想导出一个表,以四舍五入Test中的记录
有人会认为下面的陈述会奏效。但事实并非如此。
select .q.rnd "F"$(COL) from Test
我收到错误“类型”。那我如何舍入记录呢?
答案 0 :(得分:2)
如果if-else条件必须为原子布尔值的结果。在列上运行.q.rnd时,您正在操作列表,x<0
将返回布尔值列表,而不是原子。向量条件为?
尽管如此,看起来您还是想要一个整数/长整数,因此请在此处使用解析
q)t:([]string (10?-1 1)*10?10000f)
q)select "F"$x from t
x
-------------------
4123.1701336801052
-9877.8444156050682
-3867.3530425876379
7267.8099689073861
4046.5459413826466
-8355.0649625249207
6427.3701561614871
-5830.2619284950197
1424.9352994374931
-9149.8820902779698
q)select "j"$"F"$x from t
x
-----
4123
-9878
-3867
7268
4047
-8355
6427
-5830
1425
-9150
答案 1 :(得分:2)
要补充肖恩所说的话,如果您也想使用函数,可以使用var x interface{} = Req{}
var y interface{} = &x
var z interface{} = &Req{}
fmt.Printf("%T\n", y)
fmt.Printf("%T\n", z)
,它将each
应用于列表中的每个项目。
.q.rnd
但是使用q)select .q.rnd each "F"$x from t
x
-----
-3928
5171
5160
-4067
-1781
3018
-7850
5347
-7112
-4116
会更好,因为它是矢量化的。
select "F"$x from t
还应注意,.q名称空间不是必需的,并且“保留供kx使用”。许多默认的q函数都位于q)\t:1000 select "j"$"F"$x from t
22
q)\t:1000 select .q.rnd each "F"$x from t
33
命名空间中,将来的kdb更新总是有可能添加一个.q
,而该行为具有不同的行为,并且会破坏使用函数的任何代码。 / p>