对于给定的特征(线或区域)及其所有成员,我需要提取(1)所有顶点,(2)第一个顶点和(3)最后一个顶点的坐标(3个单独的查询创建3个不同的结果集)
我正在使用Oracle Spatial。
我已经为表ARAMAL测试了这个sql代码(它是一个3d线实体;主键列:IPID;几何列:GEOMETRY),它运行良好。
结果(IPID = 1479723的示例):
IPID X Y Y id
1479723 -99340.38408 -102364.3603 10 1
1479723 -99341.21035 -102366.2701 11 2
1479723 -99342.03375 -102368.1783 12 3
1479723 -99342.86238 -102370.0875 13 4
... ... .... ... ...
结果(IPID = 1479723的示例)
IPID X Y Y id
1479723 -99340.38408 -102364.3603 10 1
(预期)结果(IPID = 1479723的示例)
IPID X Y Y id
1479723 -99342.86238 -102370.0875 13 4
我想如果我使用特定的功能,这个过程可以运行得更快 - 我也希望能够使用它们。
我遇到了一个很棒的网站(Simon Greener),其中包含了一些我认为可以解决的功能
功能是:
ST_StartPoint
CREATE OR REPLACE
FUNCTION ST_StartPoint(p_geom IN mdsys.sdo_geometry)
RETURN mdsys.sdo_geometry
IS
BEGIN
RETURN ST_PointN(p_geom,1);
END ST_StartPoint;
/
ST_EndPoint
CREATE OR REPLACE
FUNCTION ST_EndPoint(p_geom IN mdsys.sdo_geometry)
RETURN mdsys.sdo_geometry
IS
BEGIN
RETURN ST_PointN(p_geom,-1);
END ST_EndPoint;
/
我是这个世界的新手,我真的没有得到这些功能的语法......
IPID X Y Y id
1479723 -99340.38408 -102364.3603 10 1
....
在此先感谢,最好的问候,佩德罗
如果您正在处理空间数据并不重要,那么您对给定id
具有最大ipid
的行感兴趣,因此您可以像这样运行它:
select *
from (
select a.ipid, t.x, t.y, t.z, t.id,
max(t.id) over (partition by a.ipid) mx_id
from aramal a, table(sdo_util.getvertices(a.geometry)) t)
where id = mx_id;
有几种方法可以获得最后一行,你可以使用row_number()
,子查询,就像在这个网站上的许多top-n
问题。