如何在KDB表中移除信息缺失的重复条目?
解决KDB+表中重复项去重(保留非空条目)的方法
针对你创建的tab表,要移除那些重复且信息缺失(sales和prices为0n)的条目,同时保留唯一的有效条目以及无重复的空值条目,这里有两种实用的方法:
方法一:利用max函数分组聚合(简洁高效)
KDB+里的0n(空值)在数值运算中会被自动忽略,max函数能直接取组内的非空有效值;对于只有空值的组(比如screw),max会返回0n,刚好匹配你的需求:
// 执行分组聚合 cleanTab: select max sales, max prices by items from tab // 若需要保持原表的条目顺序,可基于原表的items顺序重新排序 cleanTab: (select max sales, max prices by items from tab) exec items from tab
执行后结果如下:
q)cleanTab items sales prices ------------------ nut 6 10 bolt 8 20 cam 0 15 cog 3 20 screw 0n 0n
方法二:自定义分组逻辑(更灵活)
如果需要更精细的控制(比如组内有多个非空行时指定取某一行),可以用分组后过滤的方式:
// 分组后对每个组处理:优先取sales和prices都非空的条目,没有则保留原条目 cleanTab: {[g] $[count valid: g where not null sales,prices; first valid; first g]} each group items from tab
这个逻辑会先筛选出组内sales和prices均非空的行,如果存在就取第一个;如果组里全是空值(比如screw),就保留原行。
原理说明
group items from tab会把表按items字段分组,每个组对应该item的所有行- 匿名函数里的
$[condition; true-case; false-case]是KDB+的三元表达式,用来判断组内是否存在有效条目 not null sales,prices会检查每行的sales和prices是否都非空,返回布尔值列表
内容的提问来源于stack exchange,提问作者delita
相关产品推荐
相关产品推荐

