Witam
Męczę się od jakiegoś czasu z napisaniem zapytania SQL. Oto opis problemu:
Mam tabelę z trójwymiarowymi poligonami (multipolygon: ogc_fid, group_id, wkb_geometry)
Potrzebuję pogrupować je w grupy stykających się obiektów. Każdemu obiektowi w grupie nadać identyczny numer grupy. Każda z grup musi posiadać unikalny identyfikator.
Niestety funkcja wykonuje się w nieskończoność mimo iż jest tam tylko ok. 20.000 obiektów.
A oto efekt moich wydumań:
CREATE OR REPLACE FUNCTION group_objects() RETURNS boolean AS $$
DECLARE
_id integer;
_count integer;
_value integer := 1;
BEGIN
LOOP
SELECT ogc_fid, COUNT(*) INTO _id, _count FROM multipolygon WHERE group_id IS NULL GROUP BY ogc_fid LIMIT 1;
IF _count = 0 THEN RETURN true; END IF;
UPDATE multipolygon a
SET group_id = _value
FROM
(SELECT wkb_geometry
FROM multipolygon
WHERE ogc_fid = _id) b
WHERE ST_Touches(a.wkb_geometry, b.wkb_geometry);
_value := _value + 1;
END LOOP;
END; $$
LANGUAGE plpgsql
Z góry dziękuję za pomoc przy napisaniu optymalizacji tego zapytania.