kdb:由2个键列表,包括0个计数的组合

时间:2014-09-19 19:27:39

标签: kdb

当人们做select Count:count i by Id,sym from T之类的事情时,我们当然会得到一个简单的键控表,如下所示:

t1:`Id`sym xkey ([]Id:`A`A`B`B;sym:`sym1`sym2`sym2`sym3;Count:3 4 8 8)

请注意,(Id=`A, sym=`sym3)(Id=`b,sym=`sym2)没有条目。在我的制表中,我想包括这些空组合,其中计数用0填充。输出应该是这样的:

t2:`Id`sym xkey([]Id:`A`A`A`B`B`B;sym:`sym1`sym2`sym3`sym1`sym2`sym3;Count:3 4 0 0 8 8)

最干净的方法吗?

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点:

q)0^((select distinct Id from t1) cross select distinct sym from t1)#t1
Id sym | Count
-------| -----
A  sym1| 3
A  sym2| 4
A  sym3| 0
B  sym1| 0
B  sym2| 8
B  sym3| 8

或(基本上是同一件事)

q)0^2!lj[;t1] (select distinct Id from t1) cross select distinct sym from t1
Id sym | Count
-------| -----
A  sym1| 3
A  sym2| 4
A  sym3| 0
B  sym1| 0
B  sym2| 8
B  sym3| 8

注意 - 如果Count是唯一的未键控列,则“零填充”仅适用于此处。否则你必须进行更新0 ^从表中计数

答案 1 :(得分:1)

与@terrylynch相同的方法,但只是在你的t1有多个键列的情况下稍微更通用

q)t:([]id:10?3; sym:10?`a`b`c; val:10?1.)
q)k xasc 0^(flip k!flip (cross) . distinct each t k:keys tg)#tg:select ct:count i by id, sym from t
id sym| ct
------| --
0  a  | 0 
0  b  | 1 
0  c  | 2 
1  a  | 1 
1  b  | 2 
1  c  | 0 
2  a  | 1 
2  b  | 1 
2  c  | 2