说我有一张桌子:
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来执行此操作?
答案 0 :(得分:0)
我在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);
答案 1 :(得分:0)
如果我正确理解,您想在每个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快得多。