KDB:选择并四舍五入每一行

时间:2018-11-22 21:21:41

标签: kdb

我创建了自己的四舍五入函数:

.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

我收到错误“类型”。那我如何舍入记录呢?

2 个答案:

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