对给定 table 中的多个列取消分组

Ungroup over more than one columns in a given table

此处提供的答案应该适用于许多专栏, how to use ungroup with multiple composite columns in kdb

但事实并非如此。对于像这样的情况:

tb:([] x: 0 1 10; y:(1 1; 2 2 2; enlist 3); z:("kk";"ttt"; enlist "j");w:("cc";"bbbb";enlist "a")
ungroup1: {[col;tbl] @[tbl where count each tbl col;col;:;raze tbl col]}

这会起作用:

q)ungroup1[`y;tb]
x  y z     w     
-----------------
0  1 "kk"  "cc"  
0  1 "kk"  "cc"  
1  2 "ttt" "bbbb"
1  2 "ttt" "bbbb"
1  2 "ttt" "bbbb"
10 3 ,"j"  ,"a" 
```q

Again based on single column, 

```q
q)ungroup1[`z;tb]
x  y     z w     
-----------------
0  1 1   k "cc"  
0  1 1   k "cc"  
1  2 2 2 t "bbbb"
1  2 2 2 t "bbbb"
1  2 2 2 t "bbbb"
10 ,3    j ,"a" 

这行不通(引发 'length):

ungroup1[`y`z;tb]

想要的结果:

x y z w
------------
0 1 k "cc"
0 1 k "cc"
1 2 t "bbbb"
1 2 t "bbbb"
1 2 t "bbbb"
10 3 j ,"a"

我可以听听专家的一些意见吗

由于取消分组是作为 raze flip each t 实现的,您可以复制该方法,但排除(并重新加入)您 不想 取消分组的列。

q)raze{key[y]#flip[x _y],\:(x:(),x)#y}[`w]each tb
x  y z w
-------------
0  1 k "cc"
0  1 k "cc"
1  2 t "bbbb"
1  2 t "bbbb"
1  2 t "bbbb"
10 3 j ,"a"

q)raze{key[y]#flip[x _y],\:(x:(),x)#y}[`y`w]each tb
x  y     z w
-----------------
0  1 1   k "cc"
0  1 1   k "cc"
1  2 2 2 t "bbbb"
1  2 2 2 t "bbbb"
1  2 2 2 t "bbbb"
10 ,3    j ,"a"

假设您选择取消分组的列实际上是可取消分组的(也就是具有匹配的长度)