1

私は2つのテーブルを持っています。1 つは店舗のリスト (緯度/経度付き) です。もう 1 つは、顧客の住所のリスト (緯度/経度付き) です。私が欲しいのは、テーブル内の各店舗の特定の半径内の顧客数を返すクエリです。これにより、任意の店舗から 10,000 メートル以内にいる顧客の総数がわかりますが、店舗ごとに 1 行をカウントして返すようにループする方法がわかりません。

the_geom基本的に long/latである cartoDB を使用してこのクエリを実行していることに注意してください。

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_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()距離をキロメートル (度ではなく) で表現するには、代わりに を使用する必要があります。

于 2015-05-11T22:00:18.023 に答える