Postgresql 如何通过按地理坐标筛选的名称查找重复项

Postgresql 如何通过按地理坐标筛选的名称查找重复项,postgresql,postgis,Postgresql,Postgis,我需要按姓名查找重复条目(住宿),如下所示: CREATE TABLE tbl_folded AS SELECT name , array_agg(id) AS ids FROM accommodations GROUP BY 1; 这是很好的,以相同的名称获得所有住宿ID,不幸的是,他们需要进一步过滤。我只需要在一个地方找到同名的住处。 每个住宿都有一个地址(地址表有外键、住宿id和地理坐标的lonlat列)。 为了找到最近的地点,我会去圣公会。像这样 ORDER BY ST

我需要按姓名查找重复条目(住宿),如下所示:

CREATE TABLE tbl_folded AS
SELECT name
     , array_agg(id) AS ids
FROM   accommodations
GROUP  BY 1;
这是很好的,以相同的名称获得所有住宿ID,不幸的是,他们需要进一步过滤。我只需要在一个地方找到同名的住处。 每个住宿都有一个地址(地址表有外键、住宿id和地理坐标的lonlat列)。 为了找到最近的地点,我会去圣公会。像这样

ORDER BY ST_Distance(addresses.lonlat, addresses.lonlat)
那么,如何扩展上述查询以应用此位置筛选? 非常感谢您的帮助

   Column    |          Type          |                          Modifiers                          
-------------+------------------------+-------------------------------------------------------------
 id          | integer                | not null default nextval('accommodations_id_seq'::regclass)
 name        | character varying(255) | 
 category    | character varying(255) |



                                        Table "public.addresses"
      Column      |            Type             |                       Modifiers                        
------------------+-----------------------------+--------------------------------------------------------
 id               | integer                     | not null default nextval('addresses_id_seq'::regclass)
 formatted        | character varying(255)      | 
 city             | character varying(255)      | 
 state            | character varying(255)      | 
 country_code     | character varying(255)      | 
 postal           | character varying(255)      | 
 lonlat           | geography(Point,4326)       | 
 accommodation_id | integer                     | 

您可以首先通过
lonlat
列从
addresses
表分组中获取重复的
acculation\u id

select accommodation_id
from addresses
group by lonlat
having count(*) > 1
然后将此结果与
住宿
表连接,以获得
名称
列,如下所示

CREATE TABLE tbl_folded AS
select ac.id,
ac.names
from accommodation ac 
join (
select accommodation_id
from addresses
group by lonlat
having count(*) > 1
) tab on ac.id = tab.accommodation_id

我就是这样解决的。我只是过滤半径内的坐标

SELECT
  lower(name)                  AS base_name,
  array_agg(accommodations.id) AS ids

FROM accommodations
  INNER JOIN addresses ON accommodations.id = addresses.accommodation_id

GROUP BY 1, round(ST_X(lonlat::geometry)::numeric,2), round(ST_Y(lonlat::geometry)::numeric,2)

你能发布住宿和地址的表结构吗?@Rahul请找到更新数据库模式,但你的方法如何确保过滤器只在同一位置重复?那么应该是另一种方法。顺便说一句,您的地址表中有城市/州。关于地点,你的意思是在同一个城市内还是在同一个州内?应该是城市,但在这种情况下这并不重要,因为我知道我有同名但地址相同的住宿副本。城市被解析为不同的城市名称,因此,唯一可以依赖的是lonlat坐标,lonlat的组合是无效的,因为坐标可能略有不同。请您澄清一下在一个位置内的含义,正如您所说,lonlat的组合是不好的。使用Stu Dwithin可能比使用四舍五入几何坐标更好。