2016-06-21 27 views
0

中组合两个更新语句我试图将两个更新语句组合在一起。这是因为如果我不一起更新,第一个更新语句将影响第二个更新语句,但我不知道如何。在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到贸易和后来1秒更新语句将增加SP,因为有1

回答

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  
+0

我认为最后一行输出不按要求。 – Rahul

+0

@Rahul:是的,你说得对。我编辑了答案,但它现在几乎与你的答案一样 –

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”)@一个。

    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