Sql 从Postgres中的数组列聚合的不同值的数组

Sql 从Postgres中的数组列聚合的不同值的数组,sql,arrays,postgresql,aggregate-functions,Sql,Arrays,Postgresql,Aggregate Functions,假设(在PostgreSQL 9.1中)有一个具有某种标识符的表、一个integer[]类型的列和一些integer类型的其他列(至少有一列,尽管可能有更多列)(或任何其他可以求和的列) 目标是为“summable”列和数组列中所有不同元素的数组的每个标识符和提供一个聚合 我能找到的唯一方法是对子查询中的数组列使用unnest函数,然后将其与另一个聚合“summable”列的子查询连接起来 一个简单的例子如下: CREATE TEMP TABLE a (id integer, aint inte

假设(在PostgreSQL 9.1中)有一个具有某种标识符的表、一个integer[]类型的列和一些integer类型的其他列(至少有一列,尽管可能有更多列)(或任何其他可以求和的列)

目标是为“summable”列和数组列中所有不同元素的数组的每个标识符和提供一个聚合

我能找到的唯一方法是对子查询中的数组列使用unnest函数,然后将其与另一个聚合“summable”列的子查询连接起来

一个简单的例子如下:

CREATE TEMP TABLE a (id integer, aint integer[], summable_val integer);
INSERT INTO a VALUES
(1, array[1,2,3], 5),
(2, array[2,3,4], 6),
(3, array[3,4,5], 2),
(1, array[7,8,9], 19);

WITH u AS (
SELECT id, unnest(aint) as t FROM a GROUP BY 1,2
),
d AS (
SELECT id, array_agg(distinct t) ar FROM u GROUP BY 1),
v as (
SELECT id, sum(summable_val) AS val
FROM a GROUP BY 1
)
SELECT v.id, v.val, d.ar
FROM v
JOIN d
ON   v.id = d.id;
上面的代码符合我的意图,但问题是我们能做得更好吗?此解决方案的主要缺点是它读取和聚合表两次,这对于较大的表来说可能很麻烦

一般问题的另一种解决方案是避免对每个数组成员使用数组列和agregate“summable”列,然后在聚合中使用
array\u agg
——但至少现在我想坚持这种数组方式


提前感谢您的建议。

查询可能会快一点(我想),但我看不到任何显著的优化:

select a.id, sum(summable_val) val, ar
from
    (select id, array_agg(distinct t) ar 
        from 
        (select id, unnest(aint) as t from a group by 1,2) u
    group by 1) x
    join a on x.id = a.id
group by 1,3