我有两个空间表,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(...
答案 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;
虽然不会很快。