KDB表更新优化问询:按优先级生成instrumentID及对应类型
更优的kdb+ instrumentID优先级赋值实现方式
测试表定义
data:([]isin:`abc`;cusip:``jkl;sedol:`mno`)
需求说明
按 isin > cusip > sedol > ticker 的优先级,为表更新 instrumentID 和 instrumentIDType 列:
- 若
isin非空,使用isin,类型标记为ISIN - 若
isin为空,使用cusip,类型标记为CUSIP - 若
cusip也为空,使用sedol,类型标记为SEDOL - 以上均为空时,使用
ticker,类型标记为TICKER
优化实现方式
原写法通过多次update遍历表,效率较低。推荐使用向量化条件操作,仅需一次表遍历即可完成逻辑:
写法1:链式条件运算符(?)
data:update instrumentID: ?[not null isin; isin; ?[not null cusip; cusip; ?[not null sedol; sedol; ticker]]], instrumentIDType: ?[not null isin; `ISIN; ?[not null cusip; `CUSIP; ?[not null sedol; `SEDOL; `TICKER]]] from data
写法2:结合coalesce(^)与匹配逻辑
利用^运算符直接取第一个非空值生成instrumentID,再对应生成类型:
data:update instrumentID: isin ^ cusip ^ sedol ^ ticker, instrumentIDType: {`ISIN`CUSIP`SEDOL`TICKER[first where not null x]} each flip (isin; cusip; sedol; ticker) from data
优化优势
- 效率更高:仅遍历表一次,避免多次
update的重复遍历,大数据量场景下性能提升明显 - 逻辑更集中:所有优先级规则在单个
update语句中体现,可读性与维护性更强 - 内存开销更低:无需多次修改表对象,减少内存临时拷贝
内容的提问来源于stack exchange,提问作者kka
相关产品推荐
相关产品推荐

