【问题标题】:Add a filter based on other column values in kdb根据 kdb 中的其他列值添加过滤器
【发布时间】:2017-11-29 06:27:12
【问题描述】:

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

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

【问题讨论】:

    标签: database kdb q-lang


    【解决方案1】:

    给定

    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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案3】:

        给出相同的示例表 t 和 Alexanders 示例中的引用 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 的大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-17
          • 2022-12-21
          • 2019-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多