0

ポイントを行にグループ化した後、グループに関する情報を保持したいと思います。

私のデータ。

ポイントの表(ポイントはセグメントごとにグループ化され、フレームごとにグループ化され、時間順に並べられます)

フレームごとにグループ化されたポイントの新しいテーブルを作成するために、次のSQLクエリがあります。

-- Create frames from points

CREATE TABLE data.greenland_2011_p3_frames
(frm_id serial PRIMARY KEY,
geom GEOMETRY (LineString,3413));

INSERT INTO data.greenland_2011_p3_segs(geom) 

SELECT ST_MakeLine(geom) as point_geom 
FROM (SELECT * FROM data.greenland_2011_p3 ORDER BY time) a GROUP BY frame;

新しいテーブルにフレーム値とセグメント値(元のテーブルから)を保持したい

したがって、新しいテーブルは次の形式になります。

frm_id      geom       frame   segment
1        linestring    ######   ######
2        linestring    ######   ######
3        linestring    ######   ######
...          ...         ...      ...

これがフレーム/セグメントの例です

SEGMENT = 2011031614  (YYYYMMDD(SEG))  ***segment 14

FRAME = 2011031614001  or 2011031614002 (YYYYMMDD(SEG)(FRM))   ***segment 14 frames 1 and 2

編集:

これに2番目のステップを追加したいと思います。Mikeのソリューションを使用して、次のテーブルを作成しました。

frm_id      geom       frame   segment
1        linestring   *14001    *14
2        linestring   *14002    *14
3        linestring   *14003    *14
4        linestring   *15001    *15
5        linestring   *15002    *15
....

次のようなものを作成したいと思います。

seg_id      geom      segment         frames
1        linestring     *14    <*14001,*14002,*14003>
2        linestring     *14       <*15001,*15002>
....

これはどのように達成できますか?

4

1 に答える 1

1

ポイントジオメトリ、フレーム、セグメント、および時間のマスターテーブルがあるとします。

create table greenland_2011_p3 (
  gid serial primary key,
  geom geometry(Point,3413),
  frame integer,
  segment integer,
  time timestamp
);
insert into greenland_2011_p3(geom, frame, segment, time)
values
('SRID=3413;POINT(0 0)', 10, 20, '2011-08-03 10:30'),
('SRID=3413;POINT(0 1)', 10, 20, '2011-08-03 10:32'),
('SRID=3413;POINT(1 1)', 12, 20, '2011-08-03 10:35'),
('SRID=3413;POINT(1 0)', 12, 20, '2011-08-03 10:38');

selectステートメント内に「ORDERBY」を含む集計を記述し、結果のためにグループ化する必要がある他の列を特定できます。

SELECT ST_MakeLine(geom ORDER BY time) AS geom, frame, segment
FROM greenland_2011_p3
GROUP BY frame, segment;

または、すべてのフレームを文字列として一覧表示する場合は、string_aggaggagrate関数を使用できます

SELECT ST_MakeLine(geom ORDER BY time) AS geom, segment,
    '<' || array_agg(DISTINCT frame::text, ',') || '>' AS frames
FROM greenland_2011_p3
GROUP BY segment;

array_agg他の目的で配列オブジェクトが必要な場合の関数もあります。

于 2012-10-11T00:24:14.567 に答える