可以选择最接近点表的点,但我也需要点名称

时间:2018-12-03 20:52:09

标签: sql postgresql postgis

我有两个空间表,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 :(得分:3)

最简单的方法可能是完全跳过使用聚合函数,而是使用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;

答案 1 :(得分:1)

您可以使用横向连接:

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;

虽然不会很快。