根据现有列将列添加到kdb中的表中?

时间:2019-01-23 21:21:44

标签: kdb

我想向kdb表中添加一个新列,它应该通过填充如下所示的非null值来基于现有列添加

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)t
a b c
-----
a 1  
b   2
c 3  
d 4  
e   5
f 6  
g   7
h 8  

我想添加一列d,该列将从c或d中获取不为空的值 生成这样的表

a b c d
-------
a 1   1
b   2 2
c 3   3
d 4   4
e   5 5
f 6   6
g   7 7
h 8   8

我尝试了级联,但是其中包含null:

q)update d:(b,'c)from t
a b c  d  
----------
a 1    1  
b   2    2
c 3    3  
d 4    4  
e   5    5
f 6    6  
g   7    7
h 8    8  

4 个答案:

答案 0 :(得分:4)

条件向量可能就是您所追求的,如下所示:

update d:?[null b;c;b] from t

您可以阅读有关向量条件here的更多信息。这期望布尔列表作为第一个参数,并从第二个参数的列表中返回值为True的值,或者从第三个参数的列表中返回值为False的值。 例如:

q)?[10101b;”abcde”;”ABCDE”]
“aBcDe”

当与select / update语句结合使用时,可以将表的列指定为条件向量的参数,因为这些只是列表。

顺便说一句,null keyword返回一个布尔值true,其中值是null,可作为解决方案的一部分。

答案 1 :(得分:3)

您可以使用^(fill)运算符。

t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:b^c from t
a b c d
-------
a 1   1
b   2 2
c 3   3
d 4   4
e   5 5
f 6   6
g   7 7
h 8   8

值得注意的是,如果您的行中包含bc的非空值,则上面的查询将默认为c中的值。如果您希望将b中的值设置为默认值,请切换输入:

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 100 7 0n)
q)update d:b^c from t
a b c   d
-----------
a 1     1
b   2   2
c 3     3
d 4     4
e   5   5
f 6 100 100
g   7   7
h 8     8
q)update d:c^b from t
a b c   d
---------
a 1     1
b   2   2
c 3     3
d 4     4
e   5   5
f 6 100 6
g   7   7
h 8     8

答案 2 :(得分:0)

您可以使用'or(|)'运算符。

  q)update d:b|c from t

Concat将为您提供一个列表,其中包含“ b”和“ c”列中的项目。它不会删除null。 “或”将比较每对“ b”和“ c”,并将返回该对中的最大值。由于null小于整数,它将为您提供来自'b'或'c'列的整数值。

答案 3 :(得分:0)

可以在此处使用填充-https://code.kx.com/wiki/Reference/Caret

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:c^b from t
a b c d
-------
a 1   1
b   2 2
c 3   3
...