根据kdb中的单个条件更新多个列

时间:2017-12-07 09:26:10

标签: kdb

我有一张桌子 -

q)t
a b  c
--------
1 10 100
3 20 200
2 30 300
1 40 400
2 50 500

我希望根据a列上的单个“if”条件更新列b和c值。例如 -

t:update b:0 from t where a=1
t:update c:0 from t where a=1

我可以使用矢量条件但不想这样,因为它会为每一行评估条件两次,而且我的表有很多行。

update b:?[a=1;0;b], c:?[a=1;0;c] from t

我有什么办法可以做到这一点,'a = 1'条件每行只评估一次?

编辑:我之前错过了提及我希望'b'和'c'在'else'条件下取一些其他值而不仅仅保留其原始值 -

update b:?[a=1;0;-1], c:?[a=1;0;-1] from t

3 个答案:

答案 0 :(得分:1)

update b:0, c:0 from t where a=1

答案 1 :(得分:0)

如果您想在不评估条件两次的情况下使用矢量条件,则可以先评估它,例如。

q)x:t.a=1
q)x
10010b
q)update b:?[x;0;-1],c:?[x;0;-1] from t
a b  c
--------
1 0  0
3 -1 -1
2 -1 -1
1 0  0
2 -1 -1

在这里,您评估条件并将结果存储在变量中,然后在向量条件

中使用它

或者你可以做两个更新语句,例如

t:update b:0, c:0 from t where a=1
t:update b:-1, c:-1 from t where a<>1

答案 2 :(得分:0)

您可以在更新中创建一个字典,其中包含与a列相关的每个列的关联值。

update b:![1 2 3;-1 0 1]a,c:![1 2 3;-10 0 10]a from t

a b c
--------
1 -1 -10
3  1  10
2  0   0
1 -1 -10
2  0  0