2

I have a table with a array column like this:

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

And i want as result what and where is the repeated values, like this:

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

Is it possible? I don't know how to do this. I don't how to start it! I'm lost!

0

2 Answers 2

4

Use unnest to convert the array to rows, and then array_agg to build an array from the ids

It should look something like this:

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

Note that HAVING Count(Distinct id) > 1 is filtering values that don't appear even once

Sign up to request clarification or add additional context in comments.

1 Comment

Note that as currently written this will show all possible values; to show only those which appear in at least two places, you need to add a HAVING clause, e.g. HAVING Count(Distinct id) > 1, or just HAVING Count(*) > 1 if you're sure the same number will never appear twice within the same array.
3

The clean way to call a set-returning function like unnest() is in a LATERAL join, available since 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

About LATERAL:

There is nothing in your question to rule out shortcut duplicates (the same element more than once in the same array (like I@MSoP commented), so it must be count(*), not count (DISTINCT id).

1 Comment

More clean and intuitive.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.