2017-06-20 3 views
0

私はPostgreSQL 9.5データベースに2つのテーブル、すなわちptlinesを持っています。表ptpoint geometryを含み、表linesline geometryおよびvalues (numeric)を含む。次のクエリは、すべてのptためlines 50内メートル探索距離を選択し、行に新しい点を投影有する値> 500PostGIS/PostgreSQLで最高位のジオメトリを選択するにはどうすればよいですか?

Select distinct on (pt_id) 
pt.gid as pt_id, 
case when lines.value > 500 
then st_closestpoint(lines.geom, pt.geom) 
else null 
end as new_pt 
from 
pt 
left join lines on 
st_dwithin(pt.geom, lines.geom, 50) 
order by pt_id; 

サンプルシナリオは、以下の図に示されている:

The sample scenario

上記のクエリを変更して、最高値の行が最高ランクを持ち、new_ptが最高ランクの行に投影されるように、順位/優先度条件を追加する必要があります。大規模なデータセットのクエリが最初に各行にランクを割り当ててから、プロジェクトが最も高い値を持つ行をポイントするように、上記のコードを変更するにはどうすればよいですか?

答えて

2

ORDER BYリストにはDISTINCT ONよりも多くの式が必要です。 DISTINCT ONは新しいデータセットの主キーを伝えるために使用され、ORDER BYはソーステーブルのどの行がデータセットに入るかを決定します。

当然ながら、両方のリストは共通の頭を共有する必要があります。

あなたのケースでは、私はそれが

SELECT DISTINCT ON (pt_id) 
    pt.gid AS pt_id, 
    CASE 
    WHEN lines.value > 500 
     THEN st_closestpoint(lines.geom, pt.geom) 
    ELSE NULL 
    END AS new_pt 
FROM 
    pt 
LEFT JOIN lines 
    ON st_dwithin(pt.geom, lines.geom, 50) 
ORDER BY pt_id, lines.value DESC; 
+0

ありがとうございすべきだと思います。ランクを追加する必要はありませんか? –

+0

いいえ、値が最も高い行が選択されます。ここではrank()は必要ありません(使用することはできますが、この方法は短くなります) – filiprem

関連する問題