2016-06-21 2 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 до торговли, а затем один второй оператор обновления добавит 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

@ Рахул: да, ты прав. Я отредактировал ответ, но, конечно, теперь он почти такой же, как у вас –

0

Принимая пример помощи от Александра:

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

Решение:

  • проверьте, совпадает ли торговля с элементом списка (* 0; * 1).

  • получить индекс согласованного элемента.

  • 2 означает не совпадение, что означает вернуть первоначальный промысловое значение
  • Else использовать 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 
Смежные вопросы