如何在KDB中获取当日最高报价对应的时间及完整数据行?
KDB按日期分组提取m列最大值对应行的解决方案
错误原因
你使用的查询语句触发length错误,核心原因是in操作的左右两侧结构不匹配:
- 左侧
(t.date,m)生成的是每行对应一个(date, m) pair的列,长度与原表一致 - 右侧
select max m by t.date from q返回的是分组表(包含t.date和max m两列),并非可直接匹配的pair列表,导致in无法正确执行。
正确实现方法
以下三种方法均可实现按t.date分组,提取m列最大值对应的完整数据行:
方法1:使用fby(最简洁高效)
KDB的fby(filter-by)语法可直接在分组内筛选符合聚合条件的行:
select from q where m = fby(max; m; t.date)
说明:fby(max; m; t.date)会为原表每行计算其所属t.date分组内的m最大值,随后筛选出m等于该最大值的行。
方法2:等值连接(ej)+ 筛选
先生成每个日期的m最大值表,再通过ej按日期与原表连接,最后筛选匹配行:
select from ej[`t.date; q; select max_m:max m by t.date from q] where m = max_m
方法3:构造匹配的pair列表
将分组结果转换为(date, max_m)的pair列表,再用in进行匹配:
// 生成每个日期对应的(date, max m) pair集合 max_pairs: value exec (t.date, max m) by t.date from q; // 筛选原表中符合条件的行 select from q where (t.date, m) in max_pairs
也可合并为一行执行:
select from q where (t.date,m) in value exec (t.date, max m) by t.date from q
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

