我如何 select PostGIS/PostgreSQL 中排名最高的几何?
How do I select geometry of highest rank in PostGIS/PostgreSQL?
我的 PostgreSQL 9.5 数据库中有两个 table,即 pt
和 lines
。 Table pt
包含 point geometry
和 table 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;
示例场景如下图所示:
我需要修改上面的查询以添加 rank/priority 条件,以便具有最高值的行应具有最高排名,并且 new_pt
应投影到该排名最高的行。我如何修改上面的代码,以便查询大数据集时,应该首先为每一行分配排名,然后项目指向具有最高值的行?
ORDER BY
列表应该比 DISTINCT ON
有更多的表达式。 DISTINCT ON
用于告知新数据集的主键,ORDER BY
决定源 table(s) 中的哪一行进入数据集。
自然地,两个列表应该有一个共同的头部。
你的情况我认为应该是
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;
我的 PostgreSQL 9.5 数据库中有两个 table,即 pt
和 lines
。 Table pt
包含 point geometry
和 table 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;
示例场景如下图所示:
我需要修改上面的查询以添加 rank/priority 条件,以便具有最高值的行应具有最高排名,并且 new_pt
应投影到该排名最高的行。我如何修改上面的代码,以便查询大数据集时,应该首先为每一行分配排名,然后项目指向具有最高值的行?
ORDER BY
列表应该比 DISTINCT ON
有更多的表达式。 DISTINCT ON
用于告知新数据集的主键,ORDER BY
决定源 table(s) 中的哪一行进入数据集。
自然地,两个列表应该有一个共同的头部。
你的情况我认为应该是
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;