5

2D 環境でポイントを表す非常に単純なテーブルをセットアップしました。Id 列は各ポイントの ID であり、geom 列は空間へのポイントのバイナリ表現です。

テーブル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)

各ポイントから次のポイントまでの距離を見つけるために、このウィンドウ関数を使用しています:

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

これにより、次の結果が得られます ( st_distance(geom,geom) は、2 つの geom データ型間の距離を示します)。

 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..

sum 関数と lag 関数を組み合わせてみましたが、postgresql は Windows 関数をネストできないと言っています。どのように進めればよいか、私は完全に困惑しています。誰でも私を助けることができますか?

4

1 に答える 1

4

ウィンドウ関数を別のウィンドウ関数の上に置くことはできないため (「入れ子にすることはできません」)、サブクエリ レイヤー (または 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ます-これは主キーによって保証されています。

于 2013-07-24T15:55:34.757 に答える