结合 array_agg 和 unnest

Ora*_*Dog 6 postgresql aggregate array postgresql-10

给定一个数据集(GIN索引为values):

key | values
-------------
 1  | {4,2,1}
 1  | {2,5}
 2  | {4,1,3}
Run Code Online (Sandbox Code Playgroud)

我想聚合数组:

key | values
-------------
 1  | {4,2,1,5}
 2  | {4,1,3}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法不起作用:

SELECT key, array_agg(DISTINCT unnest(values)) AS values FROM data GROUP BY key
Run Code Online (Sandbox Code Playgroud)

[0A000] 错误:聚合函数调用不能包含返回集合的函数调用
提示:您可以将返回集合的函数移动到 LATERAL FROM 项中。

不熟悉LATERAL FROM,对我来说如何实现所需的输出并不明显。

a_h*_*ame 11

您需要在子查询中执行取消嵌套:

select d."key", array_agg(distinct x.v) 
from data d
  cross join lateral unnest(d."values") as x(v)
group by d."key";
Run Code Online (Sandbox Code Playgroud)

设置返回函数(如unnest())通常应用于from查询部分。但是为了能够引用表中的列,您需要横向连接

from data cross join lateral unnest(...)是一种显式的书写方式,from data, unnest(...)它也生成一个交叉连接。但我更喜欢显式cross join运算符来记录我确实打算编写交叉连接,而不是意外。

然而,这不会保留元素的顺序。

在线示例:https : //rextester.com/TVIDB57711

  • @OrangeDog:您需要交叉联接(实际上是横向联接),因为否则您无法嵌套到子查询(派生表)。`x()` 只是一个常规的[表别名](https://www.postgresql.org/docs/current/queries-table-expressions.html#QUERIES-TABLE-ALIASES),其中包含列别名 (4认同)