我有一个包含EURUSD,USDINR等符号的列。我需要创建一个新列,条件是如果货币对的前三个或后三个字母中的任何一个属于此列表
ref :(“INR”,“BLR”......)
然后我必须创建一个新列“结果”,如果条件满足则更新为“是”,否则为“否”。
任何人都可以帮助我。谢谢
答案 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