正如我所见,您正在查询中构建这样的矩阵:
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);