Basta ya de buscar por todo internet ya que llegaste al lugar correcto, poseemos la solución que quieres recibir y sin complicaciones.
Solución:
No es un problema simple, implica algún tipo de iteración forzada sobre el conjunto de puntos candidatos. Este capítulo del taller muestra un problema similar, pero no exacto (su problema es un poco más fácil)
http://postgis.net/workshops/postgis-intro/advanced_geometry_construction.html
El capítulo de búsqueda del vecino más cercano del taller muestra las herramientas que puede usar para realizar un enfoque asistido por índice con algún bucle externo que dirija la consulta.
http://postgis.net/workshops/postgis-intro/knn.html
Si sus puntos tienen una identificación distinta y conoce una tolerancia de distancia (9999), todos caerán dentro, una autounión y el uso del filtro “DISTINCT ON” le darán la respuesta de una sola vez.
WITH unfiltered AS
(
SELECT t1.id AS id1, t2.id AS id2, ST_Distance(t1.geom, t2.geom) as dist
FROM t t1, t t2 WHERE ST_DWithin(t1.geom, t2.geom, 9999) AND t1.id <> t2.id
ORDER BY t1.id, ST_Distance(t1.geom, t2.geom) ASC
)
SELECT DISTINCT ON (id1) id1, id2, dist FROM unfiltered;
Primero reúne las combinaciones de puntos candidatas y las ordena por distancia. Luego, el filtro “distinto en” elimina solo el primer miembro de cada grupo de candidatos, que convenientemente es el más cercano, gracias a la clasificación previa.
¿Algo como eso? Ser advertido, no probado.
UPDATE my_table t1
SET dist = (SELECT ST_Distance(t1.geom, t2.geom) FROM my_table t2 WHERE t2.gid <> t1.gid ORDER BY ST_Distance(t1.geom, t2.geom) LIMIT 1)
Eres capaz de añadir valor a nuestro contenido contribuyendo tu experiencia en los informes.