Трансформация sql таблицы посредством postgresql
У меня есть вот такая таблица данных, кол-во записей превышает миллион строк, уникальных attr_id, attr_name не более 20
| object_id | attr_id | attr_name | value |
|---|---|---|---|
| 7315dcbf-6178-4aa7-97ba-8875e2542471 | f5af0127-fd4c-409b-afda-b896a80f7fe1 | name | Oleg |
| 7315dcbf-6178-4aa7-97ba-8875e2542471 | ebdd03e5-a380-46bd-b505-f1f166be6409 | age | 22 |
| 7315dcbf-6178-4aa7-97ba-8875e2542471 | 735fab29-cde8-4b34-979f-864b375f820f | number | 22222 |
| 50b9d918-b0ab-41d4-957c-24f506ceb737 | f5af0127-fd4c-409b-afda-b896a80f7fe1 | name | Max |
| 50b9d918-b0ab-41d4-957c-24f506ceb737 | ebdd03e5-a380-46bd-b505-f1f166be6409 | age | |
| 50b9d918-b0ab-41d4-957c-24f506ceb737 | 735fab29-cde8-4b34-979f-864b375f820f | number | 32222 |
Хочу её преобразовать в такой формат
| object_id | name | age | number |
|---|---|---|---|
| 7315dcbf-6178-4aa7-97ba-8875e2542471 | Oleg | 22 | 22222 |
| 50b9d918-b0ab-41d4-957c-24f506ceb737 | Max | 32222 |
Возможно ли такое провернуть посредствам postgresql, если да, то как, либо же какой материал почитать?
Ответы (1 шт):
Автор решения: Arkee
→ Ссылка
Можно использовать crosstab из модуля tablefunc:
create table testTable (object_id uuid, attr_id uuid, attr_name varchar(100), value varchar(100));
insert into testTable values ('7315dcbf-6178-4aa7-97ba-8875e2542471', 'f5af0127-fd4c-409b-afda-b896a80f7fe1', 'name', 'Oleg');
insert into testTable values ('7315dcbf-6178-4aa7-97ba-8875e2542471', 'ebdd03e5-a380-46bd-b505-f1f166be6409', 'age', '22');
insert into testTable values ('7315dcbf-6178-4aa7-97ba-8875e2542471', '735fab29-cde8-4b34-979f-864b375f820f', 'number', '22222');
insert into testTable values ('50b9d918-b0ab-41d4-957c-24f506ceb737', 'f5af0127-fd4c-409b-afda-b896a80f7fe1', 'name', 'Max');
insert into testTable values ('50b9d918-b0ab-41d4-957c-24f506ceb737', 'ebdd03e5-a380-46bd-b505-f1f166be6409', 'age', NULL);
insert into testTable values ('50b9d918-b0ab-41d4-957c-24f506ceb737', '735fab29-cde8-4b34-979f-864b375f820f', 'number', '32222');
select *
from
crosstab (
'select
object_id,
attr_name,
value
from testTable',
$$values
('name'::text),
('age'::text),
('number'::text)
$$
) AS ct ("object_id" uuid, "name" text, "age" int, "number" int);
Возвращает результат:
P.S.: Если говорит, что function crosstab(unknown, unknown) does not exist надо сначала включить модуль tablefunc:
CREATE EXTENSION IF NOT EXISTS tablefunc;
