【问题标题】:add column to table in kdb based of existing columns?根据现有列向 kdb 中的表添加列?
【发布时间】:2019-01-23 21:21:44
【问题描述】:

我想在 kdb 表中添加一个新列,它应该基于现有列通过填充非空值来添加,如下所示

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)t
a b c
-----
a 1  
b   2
c 3  
d 4  
e   5
f 6  
g   7
h 8  

我想添加一个 d 列,该列将从 c 或 d 中获取不为空的值 生成这样的表格

a b c d
-------
a 1   1
b   2 2
c 3   3
d 4   4
e   5 5
f 6   6
g   7 7
h 8   8

我尝试了连接,但其中包含空值:

q)update d:(b,'c)from t
a b c  d  
----------
a 1    1  
b   2    2
c 3    3  
d 4    4  
e   5    5
f 6    6  
g   7    7
h 8    8  

【问题讨论】:

    标签: kdb


    【解决方案1】:

    向量条件可能是您所追求的,如下所示:

    update d:?[null b;c;b] from t
    

    您可以阅读有关向量条件的更多信息here。这需要一个布尔列表作为第一个参数,并从第二个参数中的列表中返回值 True,或者从第三个参数中的列表中返回值,其中 False。 例如:

    q)?[10101b;”abcde”;”ABCDE”]
    “aBcDe”
    

    当与 select/update 语句结合使用时,可以将表的列指定为条件向量的参数,因为这些只是列表。

    顺便说一句,nullkeyword 返回一个布尔值 true,其中值为 null,可用作解决方案的一部分。

    【讨论】:

      【解决方案2】:

      您可以使用^(fill) 运算符。

      t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
      q)update d:b^c from t
      a b c d
      -------
      a 1   1
      b   2 2
      c 3   3
      d 4   4
      e   5 5
      f 6   6
      g   7 7
      h 8   8
      

      值得注意的是,如果您有一行包含bc 的非空值,那么上面的查询将默认为c 中的值。如果您希望将 b 中的值设为默认值,请切换输入:

      q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 100 7 0n)
      q)update d:b^c from t
      a b c   d
      -----------
      a 1     1
      b   2   2
      c 3     3
      d 4     4
      e   5   5
      f 6 100 100
      g   7   7
      h 8     8
      q)update d:c^b from t
      a b c   d
      ---------
      a 1     1
      b   2   2
      c 3     3
      d 4     4
      e   5   5
      f 6 100 6
      g   7   7
      h 8     8
      

      【讨论】:

        【解决方案3】:

        你可以使用'or(|)'操作符。

          q)update d:b|c from t
        

        Concat 将为您提供一个包含“b”和“c”列中的项目的列表。它不会删除 null。 'or' 将比较每对 'b' 和 'c' 并将返回该对的最大值。由于 null 小于整数,因此它将为您提供来自 'b' 或 'c' 列的整数值。

        【讨论】:

          【解决方案4】:

          可以在这里使用填充 - https://code.kx.com/wiki/Reference/Caret

          q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
          q)update d:c^b from t
          a b c d
          -------
          a 1   1
          b   2 2
          c 3   3
          ...
          

          【讨论】:

            猜你喜欢
            • 2013-01-18
            • 2018-08-13
            • 2020-11-07
            • 2015-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-22
            相关资源
            最近更新 更多