在新表中保留“group by”值(ST_MakeLine)

时间:2012-10-10 18:30:29

标签: sql postgis pgadmin

我希望在将点分组后保留一些关于组的信息。

我的数据。

一个点表(点数按段分组,逐帧分组,按时间排序)

我有以下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

编辑:

我想为此添加一个辅助步骤。有了迈克的解决方案,我现在有了一个包含以下内容的表格:

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

如何实现这一目标?

1 个答案:

答案 0 :(得分: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语句中编写一个具有“ORDER BY”的聚合,并确定需要为结果分组的其他列:

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

或者如果您想将所有帧列为字符串,可以使用string_agg aggagrate函数:

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函数。