添加基于 kdb 中其他列值的过滤器

Add a filter based on other column values in kdb

我有一列包含 EURUSD、USDINR 等符号。我需要根据以下条件创建一个新列:如果货币对的前三个或后三个字母中的任何一个属于此列表
参考:("INR", "BLR".....)
然后我必须创建一个新列 "result",如果满足条件则将其更新为 "yes",否则 "No"。

谁能帮我解决这个问题。谢谢

给出

q)show t:([]pair:`EURUSD`USDINR`BLRUSD`INRBLR`BLREUR)
pair
------
EURUSD
USDINR
BLRUSD
INRBLR
BLREUR

q)ref:`USD`EUR

添加所述 "result" 列的直接查询是

q)update result:((`_'string pair)in\:ref)or(`#'string pair)in\:ref from t
pair   result
-------------
EURUSD 1
USDINR 1
BLRUSD 1
INRBLR 0
BLREUR 1

但以下替代方案可能会更快:

q)update result:0<count each ref inter/:`[=13=] 3_/:string pair from t
pair   result
-------------
EURUSD 1
USDINR 1
BLRUSD 1
INRBLR 0
BLREUR 1

给出相同的例子 table t 和参考文献 ref 来自 Alexanders 的例子你也可以建立一个匹配的开始和结束序列的列表:

q)show m:{raze(s,\:"*";"*",/:s:string(),x)}ref
"USD*"
"EUR*"
"*USD"
"*EUR"

然后找到匹配的对:

q)update max each pair like/:\:m from t
pair   m
--------
EURUSD 1
USDINR 1
BLRUSD 1
INRBLR 0
BLREUR 1

同时考虑构建列表 m 和 运行 查询的时间时,此示例的效率低于上面的示例。如果您只需要构建列表 m 那么这个示例可能更有效,但这将取决于列表的大小 ref.

另一种选择。检查每对中的 ref 和结果列表中每对值的 OR

q)ref:`USD`EUR
q)update result:(|/')ref in/: `[=10=] 3_/: string pair from t
pair   result
-------------
EURUSD 1
USDINR 1
BLRUSD 1
INRBLR 0
BLREUR 1