我想向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
答案 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
值得注意的是,如果您的行中包含b
和c
的非空值,则上面的查询将默认为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
...