2017-06-20 38 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