KDB/Q-sql动态分组和在输出中包含列

KDB/Q-sql动态分组和在输出中包含列,kdb,qsqlquery,qsqldatabase,qsqlquerymodel,Kdb,Qsqlquery,Qsqldatabase,Qsqlquerymodel,我有一个表,其中我必须对动态列执行GROUPBY并执行聚合,结果将是列值连接GROUPBY表和用户提供的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

我有一个表,其中我必须对动态列执行GROUPBY并执行聚合,结果将是列值连接GROUPBY表和用户提供的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
如果我需要对col1输出执行groupbyg1、g2、g4和avg聚合,应该是这样的

    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修复了GROUPBY列,则可以执行此操作

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
我想使用函数查询,也就是说,我想要一个函数,它采用group by列的列表、要执行的聚合以及col name和TABLE name作为输入和输出,就像上面的查询一样。我可以通过轻松使用动态列来执行分组,但无法在字段中使用cat。函数签名是这样的

    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
fun{[glist;agg;col,t]..;}[
g1
g2
g4;
avg;
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
列中。并在分组后填充
字段
列。这有助于避免生成
已归档的
副本并选择第一个副本。

如果您将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参数传递给内部函数。

感谢@Anton为我节省时间,这正是我所需要的,您能否帮助我在开始时添加“Avg[”应该是动态的,比如如果聚合是min,那么它应该是min[[A-D-H-col1],不是固定的。欢迎@sam。我更新了上述解决方案。聚合函数转换为字符串
string agg
,并传递到生成
字段值作为第二个参数的函数中。如果
aggname
不必大写,则删除带有
aggname
的行,并传递
字符串agg
ins将
aggname
插入函数