8

假设我们(在 PostgreSQL 9.1 中)有一个带有一些标识符的表、一个整数类型的列和一些其他整数类型的列(至少一个,尽管可能有更多)(或任何其他可以求和的列)。

目标是为“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;

上面的代码符合我的意图,但问题是我们能做得更好吗?该解决方案的主要缺点是它读取和聚合表两次,这对于较大的表可能很麻烦。

一般问题的其他一些解决方案是避免使用数组列并为每个数组成员聚合“summable”列,然后array_agg在聚合中使用 - 但至少现在我想坚持这种数组方式。

提前感谢您的任何想法。

4

1 回答 1

6

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

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
于 2013-02-18T18:32:29.687 回答