Postgresql dynamic dataset aggregation

Viewed 30

I'm trying to aggregate multiple datasets where I have to be able to create dynamic rules on how to aggregate the data on an id basis. Below is a quick approach I wrote up that seems to do what I intended. Is there a more performant (and preferably safe) way of doing this. tbl1...n will be larger in size than agg_rule. I'm running postgres 13.0, if there are new features coming in 14 that'll help, that could also be of interest. I am only interesting in coalescing and sum:ing like below if that simplifies the problem.

CREATE TABLE tbl1 AS
SELECT 1 id
     , 1 seq
     , 1 val;

CREATE TABLE tbl2 AS
SELECT 1 id
     , 1 seq
     , 1 val;

CREATE TABLE tbl3 AS
SELECT 1 id
     , 1 seq
     , 1 val;

CREATE TABLE agg_rule AS
SELECT 1                                         id
     , 'coalesce(tbl1.val, tbl2.val + tbl3.val)' expr;

CREATE OR REPLACE FUNCTION eval(_id INTEGER, _seq INTEGER)
    RETURNS INTEGER
    LANGUAGE plpgsql
AS $$
DECLARE _res INTEGER;
BEGIN
    EXECUTE 'SELECT ' || (
                         SELECT expr
                         FROM agg_rule
                         WHERE id = _id
                         ) || '
             FROM tbl1
                 FULL JOIN tbl2 USING (id, seq)
                 FULL JOIN tbl3 USING (id, seq)
             WHERE id = ' || _id || '
                AND seq = ' || _seq || ';' INTO _res;
    RETURN _res;
END
$$;
0 Answers
Related