Как я вижу, вы строите матрицу, подобную этой, в вашем запросе:
p1 p2 p3 p4 ... pn
p1 --- d21 d31 d41 ... dn1
p2 d12 --- d32 d42 ... dn2
p3 d13 d23 --- d43 ... dn3
p4 d14 d24 d34 --- ... dn4
..........................
pn d1n d2n d3n d4n ... ---
, но на самом деле вам нужна только половина, потому что левая нижняя половина просто дублирует верхнюю правую половину с обменом точками:
p1 p2 p3 p4 ... pn
p1 --- d21 d31 d41 ... dn1
p2 --- --- d32 d42 ... dn2
p3 --- --- --- d43 ... dn3
p4 --- --- --- --- ... dn4
..........................
pn --- --- --- --- ... ---
select t1.id as id, t2.id as id_2, t2.dist
from
centroides_batis_all as t1 cross join lateral (
select t2.id, t1.geom <-> t2.geom as dist
from centroides_batis_all as t2 where t1.id < t2.id -- the main difference here
order by dist limit 1) as t2;
Этот запрос вернет такие пары, как p1-p2, но не p2-p1 (с одинаковым расстоянием, конечно)
Чтобы исправить это, вы можете просто продублировать строки из предыдущего запроса с помощью поменялись местами:
with cte as (
select t1.id as id, t2.id as id_2, t2.dist
from
centroides_batis_all as t1 cross join lateral (
select t2.id, t1.geom <-> t2.geom as dist
from centroides_batis_all as t2 where t1.id < t2.id
order by dist limit 1) as t2)
select
case t.n when 1 then cte.id else cte.id_2 end as id,
case t.n when 1 then cte.id_2 else cte.id end as id_2,
cte.dist
from cte, (values(1), (2)) as t(n);