如何在PostgreSQL中聚合多行中的多列?

时间:2017-09-18 18:32:51

标签: postgresql aggregate-functions

如果我的问题有点模糊,这就是我的意思,我们可以使用array_agg聚合一行多行,例如我有这个表

  foo  |  bar  |  baz
-------+-------+-------
   1   |  10   |  20
   1   |  12   |  23
   1   |  15   |  26
   1   |  16   |  21

如果我调用此查询:

select
  foo,
  array_agg(bar) as bars
from table
group by (foo)

导致:

  foo  |  bars
-------+----------------
   1   |  {10,12,15,16}   

有这个表的查询是什么(使用 bar,baz )?

  foo  |  barbazs  
-------+------------------------------------
   1   |  {{10,20},{12,23},{15,26},{16,21}}

我查了functions-aggregate (postgresql.org)但是它似乎没有任何功能可以产生这种效果,或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

array_agg将数组作为可能的输入值。

我们只需要一种方法从两个输入列barbaz构建一个数组,可以使用ARRAY constructor来完成:

SELECT foo, array_agg(ARRAY[bar, baz]) as barbaz FROM table GROUP BY foo;
 foo |              barbaz               
-----+-----------------------------------
   1 | {{10,20},{12,23},{15,26},{16,21}}

注意:它也适用于DISTINCT...array_agg(distinct array[bar,baz])...