2017-06-20 41 views
0

我在我的PostgreSQL 9.5數據庫中有兩個表,即ptlines。表pt包含point geometry和表lines包含line geometryvalues (numeric)。下面的查詢,爲每個pt選擇lines 50米範圍內搜索距離和投射新點到行具有值> 500如何在PostGIS/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 ONDISTINCT 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