在postgres表中最近的点

问题描述 投票:0回答:2

当且仅当最近的条目在10英里内时,我需要一些帮助来找到特定表的每个条目的最近点到另一个。

这里有2张桌子:

Table A
lon | lat | block_id 

table B
 city        | latitude | longitude | block_id
-------------------+----------+-----------+----------

现在,我必须使用表B中最接近该条目并且如果在10英里内更新表A的blockid。如果未找到匹配项,可以将其更新为“NA”。表A由一百万个条目组成,表B为10个条目。

我正在使用postgres 9.4。我对postgres很新,因此虽然对sql很满意,但对它来说并不是很舒服。

如果有任何错误,请耐心等待。非常感谢你的帮助,我很难受。

非常感谢,

postgresql postgresql-9.4
2个回答
0
投票

你能创建一个几何类型的字段列geom吗?使用ST_point更新。

然后你做

with cte as (
      SELECT A.geom, B.geom, B.block_id,
             ST_Distance(A.geom, B.geom) as dist -- check this value first
      FROM TableA as A
      CROSS JOIN TableB as B
      WHERE ST_Distance(A.geom, B.geom) < 16000 -- 10 miles
)
SELECT *
FROM  cte

编辑:

假设您的CTE正常工作,那么您可以找到最近的点

with cte as (
  ....
), sort as (
   SELECT *, row_number() over (partition by A.id order by dist) as  rn
   FROM cte
)
SELECT *
FROM sort 
WHERE rn = 1

0
投票

非常感谢Juan的帮助,这是我要实现的步骤列表:

添加列

ALTER TABLE tableA
  ADD COLUMN geom
    geometry(Geometry,4326);

ALTER TABLE tableB
  ADD COLUMN geom
    geometry(Geometry,4326);

然后编辑tableA中的geom列,对于tableB也是如此:

update tableA set geom=ST_SetSRID(ST_Point(lon, lat),4326)::geometry;

然后得到相应的block_id

with cte as (
      SELECT A.id, A.lat, A.lon, B.latitude, B.longitude, B.city, A.geom, B.geom, B.block_id,
             ST_Distance(A.geom::geography, B.geom::geography) as dist
      FROM tableA as A
      CROSS JOIN tableB as B
      WHERE ST_Distance(A.geom::geography, B.geom::geography) < 50000 -- for 50kms
) update tableA set block_id=cte.block_id from cte as cte where tableA.id=cte.id;

但是在上面的查询中添加额外的逻辑是不知所措:如果2个block_id匹配,我想选择最接近的block_id。

再次感谢,Sudip

© www.soinside.com 2019 - 2024. All rights reserved.