私の国のOSMデータをgeofabrik.deからダウンロードし、Ubuntu 16.04にインストールされたPostgreSQL 9.6にインポートして何回も使用しました。私も正しく動作するWebアプリケーションを作成しました。そこで、いくつかのポイントから一番近い特別なポイント(レストランなど)を返す別の機能を追加することにしました。一番近い点については動作しますが、それらの戻り値の配列が必要な場合は動作しません。だから私は私の問題を分解し、奇妙な行動を見つけました。私は次のクエリを実行する場合:PostgreSQL 9.6のウィンドウ機能での不安定なクエリの動作
SELECT t.osm_id
FROM (
SELECT DISTINCT ON (a.points) a.points, v.osm_id AS osm_id, MIN(ST_DISTANCE(v.the_geom, a.points)) OVER (PARTITION BY a.points ORDER BY ST_DISTANCE(v.the_geom, a.points))
FROM (SELECT ST_GEOMFROMEWKT('SRID=4326;POINT(17.104854583740238 48.15099866770469)') AS points) a
CROSS JOIN ways_vertices_pgr v
) AS t
をそれが返されます。
| osm_id |
| ----------------- |
| 2338524511 |
私は地図上にポイントを表示する場合、それは遠く離れて原点から配置され、私はサブクエリでポイントを変更した後、結果が残っています同じ。また、表示された点と元の点の間には多くの点があり、問合せによって戻されるはずです。
SELECT t.*, t.osm_id
FROM (
SELECT DISTINCT ON (a.points) a.points, v.osm_id AS osm_id, MIN(ST_DISTANCE(v.the_geom, a.points)) OVER (PARTITION BY a.points ORDER BY ST_DISTANCE(v.the_geom, a.points))
FROM (SELECT ST_GEOMFROMEWKT('SRID=4326;POINT(17.104854583740238 48.15099866770469)') AS points) a
CROSS JOIN ways_vertices_pgr v
) AS t
、それが返されます:それから私は、クエリ次の実行を試みたSELECT一部を除いて
| points | osm_id | min | osm_id |
| -------------------------------------------------- | -------- | -------------------- | -------- |
| 0101000020E6100000010000C0D71A3140FFC3A1EC53134840 | 33169309 | 0.000124886435658481 | 33169309 |
全体のクエリは同じままですが、結果は異なっており、今では正しいです。誰も私にどのように正しく動作するようにクエリを変更することをお勧めできますか?
この 'CROSS JOINの目的は何ですか?ways_vertices_pgr v'あなたは本当にカルテンス製品を望んでいますか、それとも1列*スカラー*テーブルですか? – wildplasser
subselectには、この点だけでなく、複数の点が含まれる可能性があるためです。しかし、どちらの場合も行動は変です。 – 32cupo
st_within()またはst_distance()を使用して結合してみませんか? #strangebehaviour – wildplasser