Postgresql
結合 array_agg 和 unnest
給定一個數據集(
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
運算符來記錄我確實打算編寫交叉連接,而不是意外。但是,這不會保留元素的順序。