KDB+ 功能 Select 动态列

KDB+ Functional Select Dynamic Columns

如何动态重命名 table 中的 1 个以上的列?

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

首先我解析了日期列:

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

然后执行功能性 select 重命名它们,但没有用。

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

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

例如,假设 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

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

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;
 };