2013-02-18 2 views
8

일부 식별자가있는 테이블, 정수 [] 유형의 열 및 다른 열 (하나 이상있을 수 있음)이있는 경우 (PostgreSQL 9.1에서는) 정수 유형 (또는 합계 할 수있는 다른 유형).Postgres의 배열 열에서 집합 된 고유 값의 배열

"목표"는 각 식별자에 대해 "요약 가능"열과 배열 열의 모든 고유 요소 배열을 합한 것입니다.

내가 찾을 수있는 유일한 방법은 하위 쿼리의 배열 열에 대해 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을 집계에 사용하는 것입니다.하지만 적어도 지금은이 배열 방식을 고수하고 싶습니다. .

미리 아이디어를 제공해 주셔서 감사합니다.

답변

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