KDB中是否可通过单次查询快速实现sym的内连接操作?
更优实现方案
你原来的实现需要两次扫描表再做连接,性能和简洁度都有优化空间,以下是两种更优雅的KDB实现:
方案1:单查询+按日期分组构造对齐序列(和原逻辑完全等价)
仅扫描一次表即可完成数据提取和日期对齐,无需额外连接操作,性能远高于原实现,代码如下:
pair: {[x;y] // 按日期分组,分别提取两个标的的target1值,自动对齐日期 res: exec a:target1 where sym=x, b:target1 where sym=y by date from z where sym in (x;y); // 过滤掉两个标的不同时存在的日期,和原内连接逻辑一致 res where not null a, not null b }
如果允许单边缺失值保留(等价于外连接),去掉最后一行过滤逻辑即可。
方案2:直接计算相关系数(无需构造中间pair表)
如果你的最终目的是计算两个序列的相关性,可以直接一步完成,连中间对齐表都不需要显式构造:
corrPair: {[x;y] correl . value exec target1 where each sym in (x;y) by date from z where sym in (x;y) } // 调用示例 corrPair[`AAPL;`MSFT]
优势说明
- 仅扫描一次表,在分区大表场景下性能提升尤其明显
- 语法更简洁,省去了手动键化、连接的冗余步骤
- 逻辑更内聚,所有操作在单次查询内完成
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

