KDB/Q-sql 在输出中动态分组和倾斜列



我有一个表,我必须在动态列上执行分组依据并执行聚合,结果将是连接分组依据表和用户提供的 col 上的聚合的列值。

例如:

g1  g2  g3  g4  col1    col2
A   D   F   H   10      20
A   E   G   I   11      21
B   D   G   J   12      22
B   E   F   L   13      23
C   D   F   M   14      24
C   D   G   M   15      25

如果我需要按 g1、g2、g4 和 col1 输出的平均聚合执行分组应该是这样的

filed           val
Avg[A-D-H-col1]    10.0
Avg[A-E-I-col1]    11.0
Avg[B-D-J-col1]    12.0
Avg[B-E-L-col1]    13.0
Avg[C-D-M-col1]    14.5

如果我的列分组使用 q-sql 固定,我可以执行此操作

t:([]g1:`A`A`B`B`C`C;g2:`D`E`D`E`D`D;g3:`F`G`G`F`F`G;g4:`H`I`J`L`M`M;col1:10 11 12 13 14 15;col2:20 21 22 23 24 25)
select filed:first ("Avg[",/:(({"-" sv x} each string (g1,'g2,'g4)),:"-col1]")),val: avg col1 by g1,g2,g4 from t

我想使用相同的函数查询,这意味着我想要一个函数,它按列分组列表,执行聚合以及col名称和表名称作为输入和输出,如上述查询。我可以通过轻松使用动态列来执行分组,但无法在字段中进行 con-cat。函数签名将是这样的

fun{[glist; agg; 上校] .;... }[g1G2g4;平均;col1,t]

请帮助我使上述查询成为动态查询。

您可以尝试以下功能:

specialGroup: {[glist;agg;col;table]
res: ?[table;();{x!x}glist; enlist[`val]!enlist(agg;col)];
aggname: string agg;
aggname: upper[1#aggname], 1_aggname;
res: ![res;();0b;enlist[`filed]!enlist({(y,"["),/:("-"sv/:string flip x),:"]"};enlist,glist,enlist[enlist col];aggname)];
res
};
specialGroup[`g1`g2`g4;avg;`col1;t]

specialGroup首先将值聚合到val列中。并在分组后填充filed列。这有助于避免生成filed重复项并选择第一个重复项。

如果您将 Anton 的代码修改为此,它将动态更改输出

specialGroup: {[glist;agg;col;table]
res: ?[table;();{x!x}glist; enlist[`val]!enlist(agg;col)];
res: ![res;();0b;enlist[`filed]!enlist({(@[string[y];0;upper],"["),/:("-"sv/:string flip x),:"]"}[;agg];enlist,glist,enlist[enlist col])];
res
};

由于生成该字符串的代码部分位于另一个函数中,因此您需要将 agg 参数传递给内部函数。

相关内容

  • 没有找到相关文章

最新更新