I do not know if there is an easier way (I hope so), but it works (PostgreSQL does not have an array of arrays, so array_agg aproach does not work here):
CREATE OR REPLACE FUNCTION func() RETURNS int[] AS $$ DECLARE arr int[]; res int[]; n int; BEGIN res := '{{0, 0}}'; FOR arr IN SELECT t FROM tbl_foo LOOP res := res || arr; END LOOP; n := array_length(res, 1); RETURN res[2:n]; END $$ LANGUAGE 'plpgsql';
Example:
CREATE TABLE tbl_foo (id serial, t int[]); INSERT INTO tbl_foo (t) VALUES ('{1, 2}'), ('{5, 2}'), ('{6, 2}'), ('{1, 7}'), ('{1, 8}'), ('{1, 9}'); SELECT func(); func
EDIT:
The second solution is based on a new aggregate function called let say array2_agg :
CREATE OR REPLACE FUNCTION array2_agg_cutFirst(res anyarray) RETURNS anyarray AS $$ BEGIN RETURN res[2:array_length(res, 1)]; END $$ LANGUAGE 'plpgsql'; CREATE AGGREGATE array2_agg(anyarray) ( SFUNC = array_cat, STYPE = anyarray, FINALFUNC = array2_agg_cutFirst, INITCOND = '{{0, 0}}' ); SELECT array2_agg(t) FROM tbl_foo; array2_agg
I need the function array2_agg_cutFirst (just shortening the first subframe '{0, 0}' ) because INITCOND = '{{}}' not valid.
source share