【问题标题】:KDB+ How to Check that All Columns Have the Same Sign?KDB+ 如何检查所有列是否具有相同的符号?
【发布时间】:2018-11-10 02:31:05
【问题描述】:

我有一个包含以下列的表:日期、名称、cashType、t1、t2、t3。如果 t1、t2 和 t3 列相等,我想添加一个返回布尔值的列。

这可行,但我必须对 t1、t2 和 t3 进行硬编码。列名称根据日期而变化。我想将列列表dateCols:-3#cols data 传递到下面的代码中。

update validateSign: {x=/} each flip signum (d2018_05_28; d2018_05_29; d2018_05_30) from data

【问题讨论】:

    标签: dataframe match kdb


    【解决方案1】:

    在这种情况下,我们可以使用data dateCols 来调用查询中的列列表,

    update validateSign:{x=/}each flip signum data dateCols from data
    

    但是,我认为此查询不会产生所需的结果,替代方法是

    update validateSign:1=(count distinct@)each flip signum data dateCols from data
    

    【讨论】:

    • 这种在数据表上的 select 内索引数据表的方法不是好的做法。
    【解决方案2】:

    对于包含可变列名的更新语句,您需要使用 函数式 更新。以下链接包含更多信息:

    https://code.kx.com/q/ref/funsql/ http://code.kx.com/wiki/JB:QforMortals/queries_q_sql#Functional_Forms_of_select_and_update

    通常,推断函数更新参数的最简单方法是在您提供的示例中使用 parse 函数。

    【讨论】:

      【解决方案3】:

      Georges 关于给出错误结果的原始解决方案的评论是正确的,因为{x=/} 并没有告诉您列表中的所有项目都相等,它是一个滚动布尔值,用于检查下一个项目是否匹配零或一。像{all x[0]=x} 这样的东西会实现你想要的。

      Jemmas 指出,如果您的列名可以变化并且您想使用 select 构造,那么您将不得不使用以下形式的功能选择:

      q)data:([] date:10#.z.D;name:10?`4;cashType:10?`A`B;t1:-5+10?10;t2:-5+10?10;t3:-5+10?10)
      q)dateCols:-3#cols data
      q)![data;();0b;(1#`validateSign)!enlist ({all flip x[;0]=x};(flip signum@;enlist,dateCols))]
      date       name cashType t1 t2 t3 validateSign
      ----------------------------------------------
      2018.05.31 hjkn B        -1 4  0  0
      2018.05.31 okdm A        2  0  3  0
      2018.05.31 jggp A        3  -3 0  0
      2018.05.31 oimo A        -1 -2 -3 1
      2018.05.31 naea A        -1 4  3  0
      2018.05.31 jadb B        1  0  1  0
      2018.05.31 nojg A        4  4  4  1
      2018.05.31 keno B        4  2  -5 0
      2018.05.31 hdai B        -3 1  -5 0
      2018.05.31 mfmf A        0  1  -5 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 2021-09-11
        • 1970-01-01
        • 2011-11-21
        • 1970-01-01
        • 2013-08-21
        相关资源
        最近更新 更多