基于最新数据筛选表中唯一sym的高效KDB+实现方案问询
KDB+按优先级筛选每个sym的最新数据行(高效实现)
需求说明
现有类型为98h的KDB+表,需按date→time→Capture的优先级,筛选出每个sym对应的最新数据行,返回结果需保持原列顺序。
原始表数据
time date sym Capture 12:00:00.000 2022.09.12 `AAPL 2022.09.12D15:30:00.000000000 10:00:00.000 2022.09.10 `MSFT 2022.09.10D11:20:00.000000000 14:00:00.000 2022.09.12 `AAPL 2022.09.12D14:20:00.000000000 0Nt 2022.09.11 `AAPL 2022.09.11D10:05:00.000000000 16:00:00.000 2022.09.11 `AAPL 2022.09.12D17:20:00.000000000 0Nt 2022.09.11 `MSFT 2022.09.11D11:30:00.000000000 0Nt 2022.09.11 `MSFT 2022.09.11D15:00:00.000000000
预期输出
time date sym Capture 14:00:00.000 2022.09.12 `AAPL 2022.09.12D14:20:00.000000000 0Nt 2022.09.11 `MSFT 2022.09.11D15:00:00.000000000
高效实现方法
核心简洁写法
假设表名为t,执行以下语句即可得到结果:
select first each flip cols[t] by sym from xdesc[t;`date`time`Capture]
原理说明
- 排序优化:使用
xdesc函数按date→time→Capture的优先级降序排序整个表,确保每个sym的最新数据行排在组内最前面。xdesc是KDB+内置的高效多列排序函数,利用向量处理能力大幅提升性能。 - 分组取首行:通过
by sym分组后,取每组的第一行(first each),直接得到每个sym的最新数据行,同时保持原表的列顺序。
超大规模表优化写法(基于索引操作)
如果处理超大规模表,可采用分组后仅对组内数据排序的方式,避免全表排序的开销:
// 按sym分组,每组内按优先级降序排序后取首行索引 idx: first each reverse xdesc each flip (date;time;Capture) each group t.sym // 通过索引提取结果 result: t idx
这种方式仅对每组内的子数据集进行排序,在数据量极大时性能优势更明显。
内容的提问来源于stack exchange,提问作者Rezzy
相关产品推荐
相关产品推荐

