Можно выбрать ближайшую точку к таблице точек, но мне также нужно имя точки - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть две пространственные таблицы, sp1 имеет точки, представляющие дома, pt2 имеет точки, представляющие общественный транспорт.

Я хочу найти ближайший общественный транспорт для каждого дома.У меня это почти работает, но я не могу получить название общественного транспорта в операторе SELECT.

SELECT 
    sp1.spaddressid, 
    MIN(ST_Distance(sp1.spgeom,pt2.geom)/1000) As "Distance from address to nearest public transport"
FROM 
    public."address" sp1, 
    public."dublin_pubtrans_itm" pt2
GROUP BY sp1.spaddressid
;

Запрос работает нормально, но я хотел бы получить ближайший публичныйимя транспорта (pt2.name) для отображения.Каждый раз, когда я пытаюсь добавить его, я получаю:

ERROR: column "pt2.name" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT sp1.spaddressid, pt2.name AS "Name", MIN(ST_Distance(...

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать боковое соединение:

SELECT sp1.spaddressid, pt2.dist / 1000, pt2.name
FROM public.address AS sp1
   CROSS JOIN LATERAL (
      SELECT sp1.spgeom <-> pt.geom,
             pt.name
      FROM public.dublin_pubtrans_itm AS pt
      ORDER BY 1
      LIMIT 1
   ) AS pt2;

Это будет не очень быстро.

0 голосов
/ 04 декабря 2018

Самый простой способ сделать это, вероятно, вообще пропустить использование агрегатной функции и вместо этого использовать конструкцию DISTINCT ON, что-то вроде приведенного ниже должно дать вам по одной строке для каждого адреса с ближайшим элементом общественного транспорта, указанным в той же строке:

SELECT DISTINCT ON(sp1.spaddressid) sp1.spaddressid
 , (ST_Distance(sp1.spgeom,pt2.geom)/1000) AS "Distance from address to nearest public transport"
 , pt2.name AS "nearest public transport name"

FROM public."address" sp1, public."dublin_pubtrans_itm" pt2
ORDER BY sp1.spaddressid
 , (ST_Distance(sp1.spgeom,pt2.geom)/1000) ASC;
...