另一组点半径范围内的点数

时间:2015-05-11 18:23:25

标签: postgresql postgis cartodb

我有两张桌子。一个是商店列表(lat / long)。另一个是客户地址列表(使用lat / long)。我想要的是一个查询,它将返回表格中每个商店的特定半径范围内的客户数量。这给了我任意商店10000米范围内的客户总数,但我不知道如何循环它以为每个商店返回一行并计算。

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

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

1 个答案:

答案 0 :(得分:3)

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

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的类型为geometry,则您的查询将非常相似,但您应该使用st_distance_sphere()来表示距离(以公里为单位)(而不是度数)。