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;
};
如何动态重命名 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;
};