notes/postgres/aggregate.md
2023-01-12 17:33:50 -05:00

1.0 KiB

To extract aggregate definitions can select from pg_aggregate

SQL for current aggregates I'm using now:

CREATE OR REPLACE FUNCTION public.jsonb_concat(
    state jsonb,
    concat jsonb)
  RETURNS jsonb AS
$BODY$
BEGIN
    --RAISE notice 'state is %', state;
    --RAISE notice 'concat is %', concat;
    RETURN state || concat;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


CREATE OR REPLACE FUNCTION public.jsonb_concat_distinct_arr(
    state jsonb,
    concat jsonb)
  RETURNS jsonb AS
$BODY$
BEGIN
    --RAISE notice 'state is %', state;
    --RAISE notice 'concat is %', concat;
    RETURN SELECT jsonb_agg(state || concat;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


DROP AGGREGATE IF EXISTS public.jsonb_arr_aggc(jsonb);
CREATE AGGREGATE public.jsonb_arr_aggc(jsonb) (
  SFUNC=public.jsonb_concat,
  STYPE=jsonb,
  INITCOND='[]'
);

DROP AGGREGATE IF EXISTS public.jsonb_obj_aggc(jsonb);
CREATE AGGREGATE public.jsonb_obj_aggc(jsonb) (
  SFUNC=public.jsonb_concat,
  STYPE=jsonb,
  INITCOND='{}'
);