Мы не можем использовать оператор knn (он работает только с 2D), поэтому нам придется немного поработать.Для отдельной точки в таблице целей это будет выглядеть так:
select * , st_distance(o.geom, t.geom), st_3ddistance(o.geom, t.geom)
from obs o, target t
order by st_3ddistance(o.geom, t.geom) limit 1
Но это не сработает, если вы хотите получить результаты для нескольких целей одновременно.Если вы хотите найти самые близкие точки для многих целей, тогда мы должны использовать боковое соединение
select t2.*, a.*
from target t2,
lateral (select o.*
from obs o, target t
where t2.id=t.id
order by st_3ddistance(o.geom, t.geom) limit 1) a
Если вам нужно больше одной ближайшей точки, просто увеличьте предел.