KDB/q表:存在price则更新qty、不存在则插入的方法咨询
KDB/q 表的“存在更新qty,不存在插入”实现
内置函数说明
KDB/q 自带的upsert函数可实现基础的“更新或插入”逻辑,但它默认会覆盖匹配行的所有字段,无法直接满足你“仅更新qty、保留原有exchange_name”的需求。如果你的场景允许更新所有字段,可先将price设为表的主键,再使用upsert:
// 初始化空表并设置price为主键 table:([]price:();qty:();exchange_name:()) `table set .Q.en[`table] ([]price:();qty:();exchange_name:()) // 测试数据 data:([]price:100 200;qty:5 10;exchange_name:`NYSE`NASDAQ) // 执行upsert:存在则更新整行,不存在则插入 table upsert data
手动实现(仅更新qty)
若需严格遵循“存在时仅更新qty”的规则,需手动编写逻辑,核心步骤是先检查price是否存在,再分情况处理:
检查price是否存在的方法
使用in操作符判断目标price是否在表的price字段中:
- 单个price:
100 in table.price返回布尔值(1b/0b) - 多个price:
(100 200) in table.price返回对应长度的布尔列表,标记每个price是否存在
完整实现代码
// 封装成复用函数 upsertQtyOnly:{[targetTable;newData] // 标记新数据中哪些price已存在 isExisting:newData.price in targetTable.price; // 更新已存在price对应的qty if[any isExisting; // 找到目标表中对应price的索引 tableIdx:where targetTable.price in newData.price[isExisting]; // 批量更新qty targetTable.qty[tableIdx]:newData.qty[isExisting]; ]; // 插入不存在的新数据行 targetTable,:newData[not isExisting]; // 返回更新后的表 :targetTable }; // 使用示例 // 初始化空表 table:([]price:();qty:();exchange_name:()) // 第一次插入数据 table:upsertQtyOnly[table; ([]price:100 200;qty:5 10;exchange_name:`NYSE`NASDAQ)] // 此时table内容: // price qty exchange_name // ------------------------ // 100 5 NYSE // 200 10 NASDAQ // 第二次插入(包含已存在的price=100) table:upsertQtyOnly[table; ([]price:100 300;qty:20 15;exchange_name:`X`LSE)] // 此时table内容: // price qty exchange_name // ------------------------ // 100 20 NYSE // qty被更新,exchange_name保留原值 // 200 10 NASDAQ // 300 15 LSE // 新行插入
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

