Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1Zdgzb-0001PJ-Tf for pgsql-sql@arkaria.postgresql.org; Sun, 20 Sep 2015 15:57:32 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1Zdgza-0002EC-6K for pgsql-sql@arkaria.postgresql.org; Sun, 20 Sep 2015 15:57:30 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1ZdgzX-0002CJ-1a for pgsql-sql@postgresql.org; Sun, 20 Sep 2015 15:57:27 +0000 Received: from mbob.nabble.com ([162.253.133.15]) by magus.postgresql.org with esmtp (Exim 4.84) (envelope-from ) id 1ZdgzR-00014T-AS for pgsql-sql@postgresql.org; Sun, 20 Sep 2015 15:57:24 +0000 Received: from msam.nabble.com (unknown [162.253.133.85]) by mbob.nabble.com (Postfix) with ESMTP id 8107F15F1156 for ; Sun, 20 Sep 2015 08:51:59 -0700 (PDT) Date: Sun, 20 Sep 2015 08:57:17 -0700 (MST) From: dave To: pgsql-sql@postgresql.org Message-ID: <1442764637710-5866579.post@n5.nabble.com> In-Reply-To: <55FEBBE0.8090902@gmail.com> References: <1442747556700-5866560.post@n5.nabble.com> <55FEBBE0.8090902@gmail.com> Subject: Re: Recursive merging of overlapping arrays in a column MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Pg-Spam-Score: -1.9 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org Sorry, here is the post again in plain text... i have the following Table: CREATE TABLE arrays (id SERIAL, arr INT[]); INSERT INTO arrays (arr) VALUES (ARRAY[1,3,6,9]); INSERT INTO arrays (arr) VALUES (ARRAY[2,4]); INSERT INTO arrays (arr) VALUES (ARRAY[3,10,40]); INSERT INTO arrays (arr) VALUES (ARRAY[3,18,44]); INSERT INTO arrays (arr) VALUES (ARRAY[63,140,420]); INSERT INTO arrays (arr) VALUES (ARRAY[42,102,420]); INSERT INTO arrays (arr) VALUES (ARRAY[2,7]); INSERT INTO arrays (arr) VALUES (ARRAY[1,3,11]); INSERT INTO arrays (arr) VALUES (ARRAY[8,12,19]); I want to merge the arrays which have overlapping elements, so that I get the result which doesn't contain overlapping arrays anymore: arr -------------------------- {1,3,6,9,10,11,18,40,44} {2,4,7} {8,12,19} {42,63,102,140,420} I am not an expert in SQL and it took me a long time to come up with this solution: WITH RECURSIVE clusters AS ( select DISTINCT uniq(sort_asc(array_cat(a1.arr, a2.arr))) AS arr from arrays a1 cross join arrays a2 where a1.arr && a2.arr AND least(a1.id,a2.id) != greatest(a1.id, a2.id) UNION select DISTINCT uniq(sort_asc(array_cat(a1.arr, a2.arr))) AS arr from arrays a1 cross join clusters a2 where a1.arr && a2.arr AND a1.arr != a2.arr ) SELECT arr FROM ( SELECT * FROM ( SELECT DISTINCT ON (arr[1]) arr FROM clusters ORDER BY arr[1], array_length(arr, 1) DESC ) AS c UNION SELECT arr FROM arrays WHERE id NOT IN ( SELECT DISTINCT a1.id FROM arrays a1 CROSS JOIN arrays a2 WHERE a1.arr && a2.arr AND least(a1.id,a2.id) != greatest(a1.id, a2.id) ) ) AS clustertable ORDER BY arr; Which gives me the result: arr -------------------------- {1,3,6,9,10,11,18,40,44} {2,4,7} {3,10,18,40,44} {8,12,19} {42,63,102,140,420} (5 rows) Result number 3 is contained in number one and shouldn't be in the output anymore, because I only want non overlapping arrays in the result. Another problem I encountered is that the performance of this query seems to be very bad. I tried running it on a larger table (~400000 arrays) and it is still running after ~10h. I would appreciate any input on this problems, so it would be nice if anyone could give me a hint how to get only the merged arrays without overlaps in the resultset and maybe how to build a more elegant and efficient query. Thanks in advance, Dave -- View this message in context: http://postgresql.nabble.com/Recursive-merging-of-overlapping-arrays-in-a-column-tp5866560p5866579.html Sent from the PostgreSQL - sql mailing list archive at Nabble.com. -- Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-sql