根据条件更改 table 中特定行的值
changing value of specific row in table with conditions
假设我有以下 table。
t:([]date:5#.z.D; ric:`A.HK`B.HK`C.HK`D.KS`E.T);
从这里开始,我想删除结尾的字符串,包括“.”。如果满足某些条件。
以下是我一直在做的方式-但我想知道是否会有很多 efficient/faster 方式。
newriclist: exec distinct ric from t;
dummy:{ (`ric`newric)!(x; `$ssr[string[x]; ".KS"; ""]) } each newriclist;
t lj `ric xkey dummy ...
或者,这就是我想要理想的实现,但似乎行不通。
update ric:?[string[ric] like "*.KS"; `$ssr[string[ric]; ".KS"; ""]; ric] from `t;
使用上面的 table,您可以简单地执行以下操作:
q)update first each ` vs/:ric from `t where ric like "*.KS"
`t
q)t
date ric
---------------
2018.02.24 A.HK
2018.02.24 B.HK
2018.02.24 C.HK
2018.02.24 D
2018.02.24 E.T
对于一些解释,这使用了你可以做到的事实
q)` vs `sym.suf
`sym`suf
无需字符串即可将您的符号分解为带点的组件。这需要应用 each-right (/:
) 来对受影响的列元素进行操作。这将是 return 列表的列表,因此 first each
负责将其变回简单列表。这里的 where
条件负责确保它仅在正确的符号上运行。
作为一个快速扩展,如果您要对具有大量重复符号的大型 table 执行此操作,则使用 .Q.fu
将更有效地处理列表中的多个重复项:
update .Q.fu[{first each ` vs/:x};ric] from `t where ric like "*.KS"
假设我有以下 table。
t:([]date:5#.z.D; ric:`A.HK`B.HK`C.HK`D.KS`E.T);
从这里开始,我想删除结尾的字符串,包括“.”。如果满足某些条件。
以下是我一直在做的方式-但我想知道是否会有很多 efficient/faster 方式。
newriclist: exec distinct ric from t;
dummy:{ (`ric`newric)!(x; `$ssr[string[x]; ".KS"; ""]) } each newriclist;
t lj `ric xkey dummy ...
或者,这就是我想要理想的实现,但似乎行不通。
update ric:?[string[ric] like "*.KS"; `$ssr[string[ric]; ".KS"; ""]; ric] from `t;
使用上面的 table,您可以简单地执行以下操作:
q)update first each ` vs/:ric from `t where ric like "*.KS"
`t
q)t
date ric
---------------
2018.02.24 A.HK
2018.02.24 B.HK
2018.02.24 C.HK
2018.02.24 D
2018.02.24 E.T
对于一些解释,这使用了你可以做到的事实
q)` vs `sym.suf
`sym`suf
无需字符串即可将您的符号分解为带点的组件。这需要应用 each-right (/:
) 来对受影响的列元素进行操作。这将是 return 列表的列表,因此 first each
负责将其变回简单列表。这里的 where
条件负责确保它仅在正确的符号上运行。
作为一个快速扩展,如果您要对具有大量重复符号的大型 table 执行此操作,则使用 .Q.fu
将更有效地处理列表中的多个重复项:
update .Q.fu[{first each ` vs/:x};ric] from `t where ric like "*.KS"