Começando com alguns pontos aleatórios, em uma tentativa de imitar aqueles na imagem do OP, onde os dois primeiros se cruzam espacialmente, o segundo e o terceiro têm o mesmo atributo id (2), com alguns outros pontos que não se cruzam nem têm o mesmo atributo, a seguinte consulta produz 3 clusters:
WITH
temp (id, geom) AS
(VALUES (1, ST_Buffer(ST_Makepoint(0, 0), 2)),
(2, ST_Buffer(ST_MakePoint(-0.7,0.5), 2)),
(2, ST_Buffer(ST_MakePoint(10, 10), 2)),
(3, ST_Buffer(ST_MakePoint(-2, 12), 2)),
(4, ST_Buffer(ST_MakePoint(5, -6), 2))),
unions(geoms) AS
(SELECT ST_Union(geom) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;
Existem várias etapas aqui:
- use
ST_Union
, agrupando por ID, para agrupar primeiro por atributo
- use
ST_ClusterIntersecting
para combinar aqueles do mesmo grupo que se cruzam espacialmente
- adicione um ID a cada um dos clusters (tabela multis) - tentar fazer isso diretamente no ClusterIntersecting leva todas as geometrias a obter um ID de 1
- Unir as geometrias despejadas da etapa 2, agrupando pelo ID da etapa 3 - esta é a parte de dissolução . Isso faz com que os dois polígonos sobrepostos no cluster A sejam unidos, em vez de sobrepostos, pois estão no final da etapa 2.
Bastante longo, mas funciona (e, tenho certeza, há um caminho mais curto).
O uso da ferramenta WKT no QGIS (e a descoberta do quão péssimo sou com as ferramentas de edição) produz agrupamentos como os seguintes, onde você pode ver o agrupamento rotulado como a, todos juntos - ou seja, uma cor.
Se você colocar um ST_AsText na final, ST_UNION (d.geom), poderá ver os resultados diretamente.
EDITE seguindo mais informações nos comentários: Como você está começando com os pontos, precisará incorporar o buffer na minha solução original - que eu coloquei no temp CTE no início para imitar seu diagrama. Seria mais fácil adicionar o buffer nos uniões CTE, para que você possa fazer todas as geometrias de uma só vez. Portanto, usando uma distância do buffer de 1000, como exemplo, o seguinte agora retorna 3 clusters, conforme o esperado.
WITH temp(id, geom) AS
(VALUES
(1, ST_SetSRID(ST_GeomFromText('MultiPoint(12370 361685)'), 31256)),
(2, ST_SetSRID(ST_GeomFromText('MultiPoint(13520 360880, 19325 364350)'), 31256)),
(3, ST_SetSRID(ST_GeomFromText('MultiPoint(11785 367775)'), 31256)),
(4, ST_SetSRID(ST_GeomFromText('MultiPoint(19525 356305)'), 31256))
),
unions(geoms) AS
(SELECT st_buffer(ST_Union(geom), 1000) FROM temp GROUP BY id),
clusters(geoms) AS
(SELECT ST_CollectionExtract(unnest(ST_ClusterIntersecting(geoms)), 3)
FROM unions),
multis(id, geoms) AS
(SELECT row_number() over() as id, geoms FROM clusters)
SELECT id, ST_UNION(d.geom) FROM
(SELECT id, (ST_DUMP(geoms)).geom FROM multis) d GROUP BY id;