如何在PostGIS / PostgreSQL中选择最高等级的几何?

时间:2017-06-20 17:06:02

标签: postgresql postgis

我的PostgreSQL 9.5数据库中有两个表,即ptlines。表格pt包含point geometry,表格lines包含line geometryvalues (numeric)。对于每个pt,以下查询在50米搜索距离内选择lines并将新点指向具有值>的行。 500。

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应该被投射到这个排名最高的行。如何修改上面的代码,以便查询大型数据集,首先应该为每一行分配排名,然后项目指向具有最高值的行?

1 个答案:

答案 0 :(得分: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;