2016-09-11 12 views
0

したがって、私は船舶座標 "ship"という空間データベースを持っています。 これは、次の表があります。指定された時間間隔で、指定された距離内にあるジオメトリポイントを確認する方法が必要です

SHIPS 
============ 
id (serial) 
vessel(uuid) 
time(timestamp without timezone) 
coord(geometry(Point, 4326) 

私はYの時間間隔で、その座標が遠いXメートルある血管を返すクエリを記述する必要があります。これまでのところ、私はこれがあります。

SELECT DISTINCT ON (a.vessel, b.vessel) a.vessel, b.vessel 
FROM ships a 
INNER JOIN ships b 
ON a.vessel = b.vessel 
WHERE 
ST_DWithin((ST_Transform(a.coord, 3035)),(ST_Transform(b.coord, 3035)), 5000) 
AND (EXTRACT (EPOCH FROM(a.time - b.time))) <= 1500 
AND (a.vessel != b.vessel); 

を私はa.vessel = b.vessel制約を離れて、私はそれを削除した場合の結果は、両方の列に同じ容器であれば、それは常にnullを返します!。

答えて

0

ジョインで間違った条件を使用している:

SELECT DISTINCT ON (a.vessel, b.vessel) a.vessel, b.vessel 
FROM ships a 
INNER JOIN ships b 
ON ST_DWithin((ST_Transform(a.coord, 3035)),(ST_Transform(b.coord, 3035)), 5000) 
WHERE 
(EXTRACT (EPOCH FROM(a.time - b.time))) <= 1500 
AND (a.vessel != b.vessel); 
+0

おかげでたくさんの伴侶を。 500.000行で過去30分間のクエリを実行していて、まだ終了していません。それは普通ですか? –

+0

'ships(ST_Transform(coord、3035))'に空間インデックスがありますか? – redneb

+0

私はしませんでした。 私はちょうど "CREATE INDEX coord_gix ON GIST(coord);を使用して出荷しました;" 1つを作成して再度クエリを実行します。それは正しい方法ですか? –

関連する問題