【问题标题】:How do I parameterise the column list in KDB?如何参数化 KDB 中的列列表?
【发布时间】:2021-12-06 08:55:52
【问题描述】:

我有很多重复的查询:

select lR, e10, e25, vr from z

有没有办法可以做类似的事情:

features: `lR`e10`e25`vr

select features from z

【问题讨论】:

    标签: kdb


    【解决方案1】:

    你可以像这样使用#:

    `lR`e10`e25`vr#z
    

    注意:此处的左侧参数必须是一个列表,因此要选择单个列,请使用以下内容:

    enlist[`vr]#z
    

    例子:

    q)t:([]a:`a`b`c;b:til 3;c:0b);
    q)`a`b#t
    a b
    ---
    a 0
    b 1
    c 2
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用函数形式(您可以使用parse 构建):

      q)0N!parse"select lR, e10, e25, vr from z";
      (?;`z;();0b;`lR`e10`e25`vr!`lR`e10`e25`vr)
      
      q)features:`lR`e10`e25`vr
      q)?[z;();0b;features!features]
      

      【讨论】:

        【解决方案3】:

        如果您为此使用#,请注意它会在键控表上失败。
        修改它以适用于任何表的一种可能方法是:

        f:{[t;c] if[not .Q.qt[t]; '"Input is not a table"]; c,:(); $[99h = type[t];c#/:t;c#t]}
        

        所以确保你的表实际上是一个表,确保列是一个列表,然后执行所需的# 操作。

        q)t
        a| b c d
        -| ------
        a| 4 7 10
        b| 5 8 11
        c| 6 9 12
        q)f[t;`b]
        a| b
        -| -
        a| 4
        b| 5
        c| 6
        q)f[0!t;`b]
        b
        -
        4
        5
        6
        q)f[flip 0!t;`b]
        'Input is not a table
          [0]  f[flip 0!t;`b]
               ^
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多