我希望在将点分组后保留一些关于组的信息。
我的数据。
一个点表(点数按段分组,逐帧分组,按时间排序)
我有以下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>
....
如何实现这一目标?
答案 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
函数。