2

J'ai une table avec une colonne de tableau comme ceci:Trouver des valeurs dupliquées sur colonne de tableau

my_table 
id array 
-- ----------- 
1 {1, 3, 4, 5} 
2 {19,2, 4, 9} 
3 {23,46, 87, 6} 
4 {199,24, 93, 6} 

Et je veux que le résultat quoi et où sont les valeurs répétées, comme celle-ci:

value_repeated is_repeated_on 
-------------- ----------- 
4     {1,2} 
6     {3,4} 

C'est possible? Je ne sais pas comment faire ça. Je ne sais pas comment le démarrer! Je suis perdu!

Répondre

2

Utilisez unnest pour convertir le tableau en lignes, puis array_agg de construire un tableau de la id de

Il devrait ressembler à la quelque chose comme ceci:

SELECT v AS value_repeated,array_agg(id) AS is_repeated_on FROM 
(select id,unnest(array) as v from my_table) 
GROUP by v HAVING Count(Distinct id) > 1 

Notez que HAVING Count(Distinct id) > 1 est des valeurs de filtrage que don n'apparaît même pas une seule fois

+1

Notez que dans sa forme actuelle, toutes les valeurs possibles seront affichées; pour afficher uniquement celles qui apparaissent à au moins deux endroits, vous devez ajouter une clause 'HAVING', par ex. 'HAVING Count (Distinct id)> 1', ou juste' HAVING Count (*)> 1' si vous êtes sûr que le même nombre n'apparaîtra jamais deux fois dans le même tableau. – IMSoP

+0

@IMSoP, à droite, je vais l'ajouter à ma réponse –

+0

Merci beaucoup! Parfait! –

1

La manière propre d'appeler une fonction set-return comme unnest() est dans une jointure LATERAL, disponible si nce Postgres 9.3:

SELECT value_repeated, array_agg(id) AS is_repeated_on 
FROM my_table 
    , unnest(array_col) value_repeated 
GROUP BY value_repeated 
HAVING count(*) > 1 
ORDER BY value_repeated; -- optional 

A propos LATERAL:

Il n'y a rien dans votre question pour écarter les doublons de raccourci (plus d'une fois le même élément dans le même tableau (like [email protected] commented), il doit donc être count(*), et non count (DISTINCT id).

+0

Plus propre et intuitive. –