在kdb +中将两个更新语句组合在一起

时间:2016-06-21 21:46:52

标签: sql-update kdb

我尝试将两个更新语句组合在一起。这是因为如果我不一起更新,第一个更新语句将影响第二个更新语句,但我不知道如何。

tab:update trade:`$ssr[;"-01";""]each string deal from tab where  ((-1#'string trade) like enlist "0") and (-3#'string deal) like "-01"
tab:update trade:`$ssr[;"-01";"SP"]each string deal from tab where  ((-1#'string trade) like enlist "1") and (-3#'string deal) like "-01";

如果我没有合并,我的第一个声明可能有1个交易,后来一个更新声明将添加SP,因为有1个。

2 个答案:

答案 0 :(得分:0)

t:([] trade:`trade0`trade0`trade1`trade1`trade2; deal:`1_00`2_01`3_00`4_01`5_01)

update newtrade:`$ {$[y>1;x;ssr[x;"_01";("";"_SP")@y]]} ./: flip(string deal;"01"?last each string trade) from t where deal like "*_01"


trade  deal newtrade
--------------------
trade0 1_00         
trade0 2_01 2       
trade1 3_00         
trade1 4_01 4_SP    
trade2 5_01 5_01    

答案 1 :(得分:0)

从亚历山大那里得到榜样:

  q) t:([] trade:`trade0`trade0`trade1`trade1`trade2; deal:`$("1-00";"20-01";"3-00";"4-01";"5-01"))

解决方案:

  • 检查交易是否与列表中的元素匹配(* 0; * 1)。

  • 获取匹配元素的索引。

  • 2表示不匹配,表示返回原始交易价值
  • 否则使用ssr将字符串替换为适当的值 - > (“”;“SP”)@ a。

    q) t2: update trade:{$[2>a:(x like/: ("*0";"*1"))?1b;`$ssr[y;"-01";("";"SP")@a];x]}'[trade;string deal] from t where deal like "*-01"
    

原件:

 q) t:update trade:`$ssr[;"-01";""]each string deal from t where  ((-1#'string trade) like enlist "0") and (-3#'string deal) like "-01"
 q) t:update trade:`$ssr[;"-01";"SP"]each string deal from t where  ((-1#'string trade) like enlist "1") and (-3#'string deal) like "-01";

 q) t~ t2 / true