基于kdb中的单个条件更新多个列

基于kdb中的单个条件更新多个列,kdb,Kdb,我有一张桌子- q)t a b c -------- 1 10 100 3 20 200 2 30 300 1 40 400 2 50 500 我希望根据a列上的单个“如果”条件更新b列和c列的值。例如— t:update b:0 from t where a=1 t:update c:0 from t where a=1 我可以使用vector conditional,但不想使用,因为它会为每行计算两次条件,并且我的表有大量行 update b:?[a=1;0;b], c:?[a=1;0

我有一张桌子-

q)t
a b  c
--------
1 10 100
3 20 200
2 30 300
1 40 400
2 50 500
我希望根据a列上的单个“如果”条件更新b列和c列的值。例如—

t:update b:0 from t where a=1
t:update c:0 from t where a=1
我可以使用vector conditional,但不想使用,因为它会为每行计算两次条件,并且我的表有大量行

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

如果你想使用一个向量条件而不需要计算两次,你可以先计算它

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
t:从t更新b:0,c:0,其中a=1
t:从t更新b:-1,c:-1,其中a1

您可以在更新中创建一个字典,其中包含与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

如果a不等于1,我必须为b和c提供一些其他值,那该怎么办?i、 e.“else”部分。如果您提供的“else”仅保留现有值,则@dlynch的答案将出现这种行为-仅更新a=1的记录,其余记录将保持不变。我喜欢您的第一个建议。糟糕的是,我的问题中没有提到“其他”部分。我会编辑这个问题。@Jedi我已经更新了我的答案,包括你更新的“else”子句。如果你觉得这回答了你的问题,考虑用“绿色支票”来回答这个问题,以帮助将来有同样问题的人。
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