1

我有两张桌子。一个是商店列表(带有纬度/经度)。另一个是客户地址列表(带有纬度/经度)。我想要的是一个查询,它将为我的表中的每个商店返回一定半径内的客户数量。这给了我任何商店 10,000 米内的客户总数,但我不确定如何循环它以为每个商店返回一行并计数。

请注意,我正在使用 cartoDB 进行此查询,其中the_geom基本上是 long/lat。

SELECT COUNT(*) as customer_count FROM customer_table 
WHERE EXISTS(
    SELECT 1 FROM store_table
    WHERE ST_Distance_Sphere(store_table.the_geom, customer_table.the_geom) < 10000
)

这导致单行:

customer_count
4009

关于如何解决我的问题的建议?我愿意以其他可能更有效(更快)的方式来做这件事。

作为参考,具有商店名称的列(将在一列中)是store_identifier.store_table

4

1 回答 1

3

我假设您使用the_geom代表商店和客户的坐标(纬度/经度)。我还将假设它the_geomgeography类型。您的查询将是这样的

select s.id, count(*) as customer_count
from customers c
inner join stores s 
  on st_dwithin(c.the_geom, s.the_geom, 10000)
group by s.id

这应该为您提供整洁的桌子,其中包含商店 ID 和距离商店 10,000 米范围内的顾客数量。

如果the_geom是 type geometry,您的查询将非常相似,但您应该使用st_distance_sphere()它来表示以公里(而不是度数)为单位的距离。

于 2015-05-11T22:00:18.023 回答