2017-10-19 6 views
1

J'ai une colonne JSONB qui contient des tableaux JSON. Je dois maintenant obtenir toutes les valeurs distinctes de toutes les lignes dans un seul tableau.aplatir/concat-agréger le tableau JSONB

Entrée:

id | values 
----------- 
1 | [x, y, z] 
2 | [a, b, x] 

sortie souhaitée:

result 
--------------- 
[a, b, x, y, z] 

Je ne peux pas utiliser jsonb_agg avec DISTINCT parce que cela renvoie un tableau à 2 dimensions, et je ne peux pas trouver Aplatir ou enchaîner des fonctions agrégées. Comment puis-je resoudre ceci?

Répondre

1

Vous devez unnest les tableaux avant d'utiliser l'agrégat:

with my_table(id, data) as (
values 
    (1, '["x", "y", "z"]'::jsonb), 
    (2, '["a", "b", "x"]') 
) 

select jsonb_agg(distinct value) 
from my_table, jsonb_array_elements_text(data); 

     jsonb_agg   
--------------------------- 
["a", "b", "x", "y", "z"] 
(1 row) 

Vous regroupez pouvez les résultats:

with my_table(id, data) as (
values 
    (1, '["x", "y", "z"]'::jsonb), 
    (1, '["a", "b", "x"]'), 
    (2, '["1", "2", "3"]'), 
    (2, '["2", "3", "4"]') 
) 

select id, jsonb_agg(distinct value) 
from my_table, jsonb_array_elements_text(data) 
group by id; 

id |   jsonb_agg   
----+--------------------------- 
    1 | ["a", "b", "x", "y", "z"] 
    2 | ["1", "2", "3", "4"] 
(2 rows) 
+0

Merci! Savez-vous s'il existe un moyen d'utiliser cette approche dans une fonction de fenêtre? (Comme pour combiner tous les tableaux de lignes qui ont la même 'id'.) –

+0

Vous n'avez pas besoin d'une fonction de fenêtre, voir la réponse mise à jour. – klin

0

Si vous ne se soucient pas des éléments distincts, alors vous pourriez définir votre propre agrégateur

CREATE AGGREGATE jsonb_concat_agg (jsonb) 
(
    sfunc = jsonb_concat, 
    stype = jsonb, 
    initcond = '[]' 
); 

Ensuite, il serait

SELECT jsonb_concat_agg(values); 

Le résultat serait

result 
--------------- 
[a, b, x, x, y, z] 
+0

@a_horse_with_no_name pas vraiment, ici [a, b, x] et [x, y, z] sont distincts. Il s'intéresse aux éléments distincts des tableaux, pas aux tableaux distincts –