我的PostgreSQL 9.5数据库中有两个表,即pt
和lines
。表格pt
包含point geometry
,表格lines
包含line geometry
和values (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;
示例场景如下图所示:
我需要修改上面的查询以添加排名/优先级条件,以便具有最高值的行应该具有最高排名,并且new_pt
应该被投射到这个排名最高的行。如何修改上面的代码,以便查询大型数据集,首先应该为每一行分配排名,然后项目指向具有最高值的行?
答案 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;