Agregando conjuntos conectados de nodos / aristas
Tengo un conjunto de bordes conectados con nodos únicos. Están conectados mediante un nodo principal. Considere el siguiente ejemplo de código e ilustración:
CREATE TABLE network (
node integer PRIMARY KEY,
parent integer REFERENCES network(node),
length numeric NOT NULL
);
CREATE INDEX ON network (parent);
INSERT INTO network (node, parent, length) VALUES
(1, NULL, 1.3),
(2, 1, 1.2),
(3, 2, 0.9),
(4, 3, 1.4),
(5, 4, 1.6),
(6, 2, 1.5),
(7, NULL, 1.0);
Visualmente, se pueden identificar dos grupos de bordes. ¿Cómo se pueden identificar los dos grupos usando PostgreSQL 9.1 ylength
sumado? Se muestra el resultado esperado:
edges_in_group | total_edges | total_length
----------------+-------------+--------------
{1,2,3,4,5,6} | 6 | 7.9
{7} | 1 | 1.0
(2 rows)
Ni siquiera sé por dónde empezar. ¿Necesito un agregado personalizado o una función de ventana? Podría usarWITH RECURSIVE
para recoger de forma iterativa los bordes que se conectan? Mi caso del mundo real es una red de flujo de 245,000 bordes. Espero el número máximo deedges_in_group
ser inferior a 200 y un par de cientos de grupos agregados (filas).