2013-02-18 20 views
8

いくつかの識別子、整数[]型の列、および他のいくつかの列(少なくとも1つはあるかもしれません)を持つテーブルを(PostgreSQL 9.1では)整数型(または合計可能な他の型)Postgresの配列列から集計された別個の値の配列

目標は、「合計」列と配列列のすべての異なる要素の配列の各識別子の合計を示す集合体を持つことです。

私が見つけることができる唯一の方法は、サブクエリ内の配列列に対して不必要な関数を使用し、それを他のサブクエリと結合して「合計」列を集約することです。次のように

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

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回読み込み、集約することで、大きなテーブルでは面倒になる可能性があることです。

一般的な問題の解決策のいくつかは、アレイの列を使用せず、各アレイメンバーに「summable」列を集約し、集約でarray_aggを使用することです - 少なくとも今のところ私はこの配列方法に固執したい。

ありがとうございました。

答えて

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 
関連する問題