说我有一张桌子:
ID X Y TIME
---------------------
A 1 2 0
B 9 5 0
A 2 3 1
C 0 0 3
B 9 6 1
B 10 6 2
C 1 0 5
A 2 9 11
...
我希望能够制作出这样的线条:
ID LINE
A (1,2) -> (2,9)
B (9,5) -> (10, 6)
C (0,0) -> (1, 0)
因此,我们为每个ID从最早的开始时间到最晚的结束时间进行分数。
我怎么能写PostGIS SQL来做这个操作?
我在PostGIS SQL中没有雄辩,所以我可能在这里错了,但在SQL中你通常需要这样做:
insert into SecondTable(ID, LINE)
select ID, as LINE
from FirstTable l
join FirstTable r
on l.ID = r.ID
where
not exists (select ID
from FirstTable aux
where aux.TIME < l.TIME or aux.TIME > r.TIME) and
not exists (select ID
from SecondTable
where l.ID = SecondTable.ID);
如果我正确理解你想在每个id的第一个和最后一个点之间创建一条直线。如果是正确的话:
with pr as(select id, x, y,
row_number() over (partition by id order by time, (x,y)) rnk_asc,
row_number() over (partition by id order by time desc,(x,y)) rnk_desc
from points)
select pr.id, st_makeline(st_point(pr.x, pr.y) , st_point(pr2.x, pr2.y))
from pr, pr pr2
where pr.id=pr2.id
and pr.rnk_asc=1
and pr2.rnk_desc=1
一点代码说明:
我希望它会对你有所帮助。如果你有大量的数据要转换给我一个标志,我可以给你一些提示,使它比这个简单的SQL快得多。