Postgresql

結合 array_agg 和 unnest

  • July 3, 2019

給定一個數據集(GIN索引為values):

key | values
-------------
1  | {4,2,1}
1  | {2,5}
2  | {4,1,3}

我想聚合數組:

key | values
-------------
1  | {4,2,1,5}
2  | {4,1,3}

我的第一個想法沒有奏效:

SELECT key, array_agg(DISTINCT unnest(values)) AS values FROM data GROUP BY key

$$ 0A000 $$錯誤:聚合函式呼叫不能包含集合返回函式呼叫

提示:您可能能夠將集合返回函式移動到 LATERAL FROM 項中。

不熟悉LATERAL FROM,對我來說如何實現所需的輸出並不明顯。

您需要在子查詢中進行嵌套:

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

集合返回函式(如unnest())通常應在from查詢部分使用。但是為了能夠引用表中的列,您需要橫向連接

from data cross join lateral unnest(...)是一種顯式的書寫方式,from data, unnest(...)它也會生成交叉連接。但我更喜歡顯式cross join運算符來記錄我確實打算編寫交叉連接,而不是意外。

但是,這不會保留元素的順序。

線上範例:https ://rextester.com/TVIDB57711

引用自:https://dba.stackexchange.com/questions/241989