我有两张桌子。一个是商店列表(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
答案 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()
来表示距离(以公里为单位)(而不是度数)。