根据kdb中的其他列值添加过滤器

时间:2017-11-29 06:27:13

标签: database kdb q-lang

我有一个包含EURUSD,USDINR等符号的列。我需要创建一个新列,条件是如果货币对的前三个或后三个字母中的任何一个属于此列表
ref :(“INR”,“BLR”......)
然后我必须创建一个新列“结果”,如果条件满足则更新为“是”,否则为“否”。

任何人都可以帮助我。谢谢

3 个答案:

答案 0 :(得分:3)

鉴于

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

q)ref:`USD`EUR

直接查询添加所描述的"结果"列将是

q)update result:((`$3_'string pair)in\:ref)or(`$3#'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/:`$0 3_/:string pair from t
pair   result
-------------
EURUSD 1
USDINR 1
BLRUSD 1
INRBLR 0
BLREUR 1

答案 1 :(得分:2)

从Alexanders示例中提供相同的示例表t和引用ref,您还可以构建匹配的开始和结束序列的列表:

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的大小。

答案 2 :(得分:2)

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

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