Re: Flattening a kind of 'dynamic' table
От | Dawid Kuroczko |
---|---|
Тема | Re: Flattening a kind of 'dynamic' table |
Дата | |
Msg-id | 758d5e7f050127082755f9af12@mail.gmail.com обсуждение исходный текст |
Ответ на | Flattening a kind of 'dynamic' table (Alexandre Leclerc <alexandre.leclerc@gmail.com>) |
Ответы |
Re: Flattening a kind of 'dynamic' table
Re: Flattening a kind of 'dynamic' table |
Список | 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 по дате отправления: