2013-02-18 10 views
8

Supponiamo di avere (in PostgreSQL 9.1) una tabella con qualche identificatore, una colonna di tipo intero [] e alcune altre colonne (almeno una, anche se potrebbe essercene di più) di tipo intero (o qualsiasi altro che può essere sommato).array di valori distinti aggregati da una colonna di array in Postgres

L'obiettivo è disporre di una somma aggregata per ogni somma di identificatore della colonna "sommabile" e una matrice di tutti gli elementi distinti della colonna di matrice.

L'unico modo che riesco a trovare è quello di utilizzare una funzione non valida sulla colonna dell'array in una sottoquery e di unirla ad un'altra sottoquery che aggrega le colonne "sommabile".

Un semplice esempio è il seguente:

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; 

Il codice di cui sopra fa quello che volevo, ma la domanda è: possiamo fare di meglio? Il principale inconveniente di questa soluzione è che legge e aggrega due volte la tabella, il che potrebbe essere problematico per tabelle più grandi.

qualche altra soluzione al problema generale è quello di evitare di utilizzare la colonna di matrice e la colonna Agregate "sommabili" per ogni membro di matrice e quindi utilizzare array_agg in aggregazione - ma almeno per ora mi piacerebbe attenersi a questo modo di matrice .

Grazie in anticipo per qualsiasi idea.

risposta

6

La query può essere un po 'più veloce (suppongo), ma non riesco a vedere alcun notevoli ottimizzazioni:

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 
Problemi correlati