2013-07-24 1 views
4

2D 환경에서 포인트를 나타내는 매우 간단한 테이블을 설정했습니다.postgresql의 윈도우 함수를 사용하여 누적 합계에 대한 SQL 쿼리

public.foo

Column |   Type   |     Modifiers     
--------+----------------------+-------------------------------------------- 
id  | integer    | not null default nextval('mseq'::regclass) 
geom | geometry(Point,2100) | 

인덱스 :

"foo_pkey" PRIMARY KEY, btree (id) 
    "foo_index_gist_geom" gist (geom) 

부터 거리를 찾기 위해 ID 열은 각 점과 기하 열의 ID가 공간에 포인트의 이진 표현이다 다음 각 지점을 가리키며이 창 함수를 사용하고 있습니다 :

select 
    id, 
    st_distance(geom,lag(geom,1) over (order by id asc)) distance 
from 
    foo; 

이는 다음과 같은 결과 (이 ST_Distance (기하, 기하 구조) 두 개의 기하 구조 데이터의 입력 사이의 거리를 제공한다)

id |  distance  
----+------------------ 
    1 |     
    2 | 27746.1563439608 
    3 | 57361.8216245281 
    4 | 34563.3607734946 
    5 | 23421.2022073633 
    6 | 41367.8247514439 
.... 

distance(1) -> null since its the first point 
distance(2) -> ~28km from point 1 to point 2 
distance(3) -> ~57km from point 2 to point 3 
and etc.. 

내 목적은 각 노드에 대한 시작부터 다음의 각 점으로부터 누적 거리를 찾는 것이다. 아래의이 모의 테이블과 같은 예 :

id |  distance  | acc 
----+------------------+----- 
    1 |     | 
    2 | 27746.1563439608 | 27746.1563439608 
    3 | 57361.8216245281 | 85107.97797 
    4 | 34563.3607734946 | 119671.33874 

where acc(1) is null because it is the first node, 
acc(2) = acc(1) + dist(2) 
acc(3) = acc(2) + dist(3) 

and etc.. 

내가 합 지연 기능을 결합하는 시도하지만, PostgreSQL의 윈도우 기능이 중첩 될 수 있다고 말한다. 계속 진행하는 방법에 대해 완전히 당황 스럽다. 나를 도울 수있는 사람?

답변

2

다른 윈도우 함수를 통해 윈도우 함수 ("중첩 될 수 없습니다"), 하위 쿼리 층을 추가해야합니다 (또는 CTE)가 없기 때문에 :

SELECT id, sum(distance) OVER (ORDER BY id) AS cum_dist 
FROM (
    SELECT id, st_distance(geom, lag(geom, 1) OVER (ORDER BY id)) AS distance 
    FROM foo 
    ) sub 
ORDER BY id; 

id이 고유한지 가정을 - 이는 기본 키로 보장됩니다.