Postgresql-Map数组按特定顺序聚合为单个数组

Postgresql-Map数组按特定顺序聚合为单个数组,sql,arrays,postgresql,aggregate-functions,Sql,Arrays,Postgresql,Aggregate Functions,我有一个PostgreSQL表,其中包含一列一维数组数据。我希望在此列上执行聚合查询,获取数组中每个元素的min/max/mean以及组计数,并将结果作为一维数组返回。表中的数组长度可能不同,但我可以确定,在我执行的任何分组中,所有数组的长度都相同 在一个简单的形式中,假设我的数组长度为2,并且有x和y的读数,我想返回结果 {Min(x),Max(x),Mean(x),Min(y),Max(y),Mean(y),Count()} 我能够得到形式为{Min(x),Min(y),Max(x),Max

我有一个PostgreSQL表,其中包含一列一维数组数据。我希望在此列上执行聚合查询,获取数组中每个元素的min/max/mean以及组计数,并将结果作为一维数组返回。表中的数组长度可能不同,但我可以确定,在我执行的任何分组中,所有数组的长度都相同

在一个简单的形式中,假设我的数组长度为2,并且有x和y的读数,我想返回结果 {Min(x),Max(x),Mean(x),Min(y),Max(y),Mean(y),Count()}

我能够得到形式为{Min(x),Min(y),Max(x),Max(y),Mean(x),Mean(y)Count()}的结果,但是我无法从那里得到我想要的结果

下面是一个示例,显示了到目前为止我所处的位置(这次使用长度为3的数组,但没有平均聚合,因为pgSql中内置的数组没有平均聚合): ()

以上给我的

{11,12,13,-11,-12,-13,3}

但是,我不知道如何将上述结果转换为我想要的结果,即:

{11,-11,12,-12,13,-13,3}

我应该使用什么函数来转换上述内容


请注意,上面的聚合函数与我用来获取最小值、最大值的函数并不完全匹配-我正在使用扩展来获得最小值、最大值和平均值。

我建议使用数组操作和聚合:

select x.some_key,
       array_agg(u.val order by x.n, u.nn)
from (select t.some_key, ed.n, min(val) as minval, max(val) as maxval
      from my_test t cross join lateral
           unnest(t.event_data) with ordinality as ed(val, n)
      group by t.some_key, ed.n
     ) x cross join lateral
     unnest(array[x.minval, x.maxval]) with ordinality u(val, nn)
group by x.some_key;
就个人而言,我更喜欢一个包含三个元素的数组,并将最小/最大值作为记录:

select x.some_key, array_agg((x.minval, x.maxval) order by x.n)
from (select t.some_key, ed.n, min(val) as minval, max(val) as maxval
      from my_test t cross join lateral
           unnest(t.event_data) with ordinality as ed(val, n)
      group by t.some_key, ed.n
     ) x 
group by x.some_key;

是一个dbfiddle。

谢谢,对我来说有一些新的术语,比如横向连接,所以我花了一些时间来理解查询是如何工作的。很高兴他们帮我安装了一个db扩展来在阵列上执行聚合。结果的替代格式是一个有效的建议,但查询结果必须与RESTAPI中约定的格式匹配。如果我可以要求对您的示例进行进一步细化,我应该如何在结果数组的末尾追加行计数一次?(为了得到像{avg(x)、min(x)、max(x)、avg(y)、min(y)、max(y)、count(*)这样的值)In FiffguSon……如果这样的话,你可以考虑接受这个答案。至于行数,我建议你问一个新的问题;这个问题很复杂。包括结果数组中的计数是我原来的问题的一部分,所以它对我来说还没有完全解决这个问题。注意,但作为一个新用户,所以不允许我这么做。
select x.some_key, array_agg((x.minval, x.maxval) order by x.n)
from (select t.some_key, ed.n, min(val) as minval, max(val) as maxval
      from my_test t cross join lateral
           unnest(t.event_data) with ordinality as ed(val, n)
      group by t.some_key, ed.n
     ) x 
group by x.some_key;