【问题标题】:KDB+ Functional Select Dynamic ColumnsKDB+ 功能选择动态列
【发布时间】:2018-06-03 01:42:01
【问题描述】:

如何动态重命名表中的多于 1 列?

例如:我想解析出 3 个日期列并将它们重命名为 balanceT1、balanceT2 和 balanceT3

首先我解析了日期列:

balanceCols:string (cols balanceData) where ((string cols balanceData) like "*_*")and not (string cols balanceData) like "*Post*"

然后进行功能选择以重命名它们,但不起作用。

 balanceData:?[balanceData;();0b;(`parentPort;`portfolio;`currency;`balanceT1;`balanceT2;`balanceT3;`minBalanceTransferUsd;`odSubPort)!(`parentPort;`portfolio;`currency;balanceCol;(^;0f;`minBalanceTransferUsd);`overdraftSubPortId)];

【问题讨论】:

    标签: select dynamic functional-programming kdb


    【解决方案1】:

    看起来您在尝试创建字典时正在创建一个嵌套的值列表,它与键列表的长度不同。

    例如,假设balanceCol 被定义为`a`b`c 那么:

    q)count(`parentPort;`portfolio;`currency;`balanceT1;`balanceT2;`balanceT3;`minBalanceTransferUsd;`odSubPort)
    8
    q)balanceCol:`a`b`c
    q)count(`parentPort;`portfolio;`currency;balanceCol;(^;0f;`minBalanceTransferUsd);`overdraftSubPortId)
    6
    

    这里有 6 个值,但有 8 个键。要解决此问题,您可以像这样将它们连接在一起:

    `parentPort`portfolio`currency,balanceCol,enlist[(^;0f;`minBalanceTransferUsd)],`overdraftSubPortId
    

    至于使查询动态化,以下函数将允许您基于任意数量的日期列为功能选择构建字典,同时仍保持您在上面使用的列顺序。

    f:{[d]
      k:`parentPort`portfolio`currency,(`$"balanceT",/:string 1+til count d),`minBalanceTransferUsd`odSubPort;
      v:`parentPort`portfolio`currency,d,enlist[(^;0f;`minBalanceTransferUsd)],`overdraftSubPortId;
      :k!v;
     };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 2017-01-27
      相关资源
      最近更新 更多