根据条件更改表中特定行的值

时间:2018-02-24 11:49:02

标签: kdb

让我们假设我有下表。

    t:([]date:5#.z.D; ric:`A.HK`B.HK`C.HK`D.KS`E.T);

从这里,我想删除尾随字符串,包括"。"如果满足某些条件。

以下是我一直在做的事情 - 但我想知道是否会有更高效/更快的方式。

     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;

1 个答案:

答案 0 :(得分:6)

使用上面的表格,你可以做到:

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

将您的syms分解为虚线组件,而不必使用字符串。这需要每个右侧(/:)应用以对受影响的列元素进行操作。这将返回列表列表,因此first each负责将其转换回简单列表。这里的where条件负责确保它只对正确的符号进行操作。

作为一种快速扩展,如果您将此操作添加到包含大量重复系统的大表中,则使用.Q.fu可以更有效地操作列表中的多个重复项:

update .Q.fu[{first each ` vs/:x};ric] from `t where ric like "*.KS"