KDB中如何统计多列不同元素数量并合并结果表?
KDB统计指定列去重元素数的合并问题
你遇到的格式问题,本质是因为f each lst返回的是三个单键字典的列表,而非多个单列表格。KDB里单独显示单键字典时会自动渲染成表的样式,但它的本质还是字典;当你用(),/: 处理这个字典列表时,并没有将它们合并为一个表,只是保留了字典列表的结构,所以输出成了多个独立字典的形式。
解决方法
方法1:一次查询生成目标表(推荐,更高效)
不用循环调用函数,直接通过元编程构造多列的去重计数查询,一次得到合并后的表:
lst:`a`b`c ans:?[`table;();0b;lst!enlist(#:;(?:;)) each lst]
这段代码等价于执行:
select a:count distinct a, b:count distinct b, c:count distinct c from table
方法2:修改函数后合并字典
如果坚持用each调用的方式,修改函数让它直接返回键值对,再合并成字典后转表:
// 修改函数,返回列名到去重计数的映射 f:{[x] x!#{x}table} // 合并所有键值对为一个字典,再转成表 ans:flip enlist lst!f each lst
为什么原来的方式不行?
你写的f函数返回的是单键字典(显示为表样式),f each lst得到的是(+a!,,983; +b!,,931; +c!,,5)这样的字典列表。(),/: 是对每个字典执行(),`操作,也就是将空列表和字典连接,结果还是原字典,最终得到的还是字典列表,自然无法合并为单表。
内容的提问来源于stack exchange,提问作者Ciaran
相关产品推荐
相关产品推荐

