8

(PostgreSQL 9.1では)いくつかの識別子、integer []型の列、および整数型(または合計できるその他の列)の他の列(少なくとも1つ、さらにある場合もあります)を持つテーブルがあるとします。

目標は、「合計可能」列の各識別子の合計と、配列列のすべての個別の要素の配列を与える集計を作成することです。

私が見つけることができる唯一の方法は、サブクエリの配列列でunnest関数を使用し、それを「合計可能な」列を集約する別のサブクエリと結合することです。

簡単な例は次のとおりです。

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;

上記のコードは私が意図したことを実行しますが、問題は私たちがもっとうまくできるかどうかです。このソリューションの主な欠点は、テーブルを2回読み取り、集約することです。これは、大きなテーブルでは問題になる可能性があります。

一般的な問題に対する他の解決策は、配列列の使用を避け、各配列メンバーの「合計可能」列を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 に答える