tableau de valeurs distinctes rassemblées à partir d'une colonne de tableau dans Postgresql

Supposons que nous avons (dans PostgreSQL 9.1) une table avec un identificateur, une colonne de type integer[] et quelques autres colonnes (au moins un, même s'il pourrait être plus) de type entier (ou tout autre qui peut être résumé).

Le but est d'avoir un total donnant pour chaque identificateur de la somme de la "summable" colonne et un tableau de tous les éléments distincts d'une colonne de tableau.

La seule façon que je peux trouver est d'utiliser unnest fonction sur la colonne de tableau dans une sous-requête et de le fusionner avec un autre sous-requête agrégeant les "summable" de colonnes.

Un exemple simple est la suivante:

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;

Le code ci-dessus ne fait ce que je désirais, mais la question est peut-on faire mieux? Le principal inconvénient de cette solution c'est qu'il lit et de table agrégée deux fois, ce qui peut être gênant pour les grandes tables.

Une autre solution pour le problème général est d'éviter d'utiliser la colonne de tableau et agréger "summable" colonne pour chaque membre du groupe et ensuite utiliser array_agg de l'agrégation - mais, au moins, pour l'instant, je voudrais tenir à ce tableau.

Merci d'avance pour toutes vos idées.

OriginalL'auteur Michal Podlewski | 2013-02-18