Re: Flattening a kind of 'dynamic' table - Mailing list pgsql-performance

From Dawid Kuroczko
Subject Re: Flattening a kind of 'dynamic' table
Date
Msg-id 758d5e7f050127082755f9af12@mail.gmail.com
Whole thread Raw
In response to Flattening a kind of 'dynamic' table  (Alexandre Leclerc <alexandre.leclerc@gmail.com>)
Responses Re: Flattening a kind of 'dynamic' table
Re: Flattening a kind of 'dynamic' table
List pgsql-performance
On Thu, 27 Jan 2005 10:23:34 -0500, Alexandre Leclerc
<alexandre.leclerc@gmail.com> wrote:
> Here a normal listing of design.product_department_time:
>  product_id | department_id | req_time
> ------------+---------------+----------
>         906 | A             |     3000
>         906 | C             |     3000
>         906 | D             |     1935
>         907 | A             |     1500
>         907 | C             |     1500
>         907 | D             |     4575
>         924 | A             |     6000
>         924 | C             |     1575

Well, I did something like this recently; it can be done though
maybe not very efficiently...

Unfortunately we will need a rowtype with all the departaments:
CREATE DOMAIN departaments AS (a int, b int, c int, d int, ...);

A function aggregate for this type:
CREATE FUNCTION dep_agg(ds departaments, args text[]) RETURNS departaments AS $$
   BEGIN
      IF args[1] = 'A' THEN ds.a = args[2]; -- I think it is not
possible to do ds.$args[1] = args[2] equivalent.
      ELSIF args[1] = 'B' THEN ds.b = args[2];
      ELSIF args[1] = 'C' THEN ds.c = args[2];
      ELSIF args[1] = 'D' THEN ds.d = args[2];
      END IF;
      RETURN ds;
   END;
$$ LANUGAGE plpgsql;

THEN an aggregate:
CREATE AGGREGATE dep_aggregate (basetype = text[], stype =
departaments, sfunc =dep_agg);

AND then a view for sugar:

CREATE VIEW prod_dep_time VIEW AS
   SELECT product_id, (dep_aggregate(ARRAY[departament_id, req_time]::text[])).*
   FROM product_department_time GROUP BY product_id;

And voila. :)
Couple of comments:
 -- aggregate takes array[] since making "multicolumn" aggregates is
not possible, as far as I know.
 -- I did not check the code, yet I did manage to make it work some time before.
 You may need to use "ROWS" or something in the function definition; I
don't remember and can't check it right now.
 -- comments welcome. :)

   Regards,
      Dawid

pgsql-performance by date:

Previous
From: "Merlin Moncure"
Date:
Subject: Re: Flattening a kind of 'dynamic' table
Next
From: PFC
Date:
Subject: Re: [SQL] OFFSET impact on Performance???