Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Написать непростой запрос


Автор: polin11 8.11.2021, 02:47
Использую СУБД Postgresql, есть таблица

https://www.db-fiddle.com/f/3ERqNCRRXJh5yEJvDtJMQf/0

Код

CREATE TABLE forms (
    id serial PRIMARY KEY,
    account int not null,
    author text,
    doc int NOT NULL,
    users text[]
);

нужно получить результат следующего вида 

Код

author : {account: [users]}



insert into  forms(account, author, doc, users) values 
Код

(1, 'Иванов', 3, array['Петя', 'Вася']),
(1, 'Иванов', 3, array['Иван']),
(2, 'Иванов', 3, array['Иван']),
(2, 'Сергеев', 3, array['Павел']),
(2, 'Сергеев', 3, array['Роман']),
(1, 'Сергеев', 3, array['Коля' , 'Дима'])



для предыдущего набора должны получить такой результат
Код

'Иванов': {1: ['Петя', 'Вася', 'Иван'], 2: ['Иван']},
'Сергеев': {1: ['Коля' , 'Дима'], 2: ['Павел', 'Роман']}



Нужно написать запрос, который вернет результат с такой структурой, 
чтобы потом по минимуму в коде формировать такой словарь.

Нужна конструктивная идея как написать такой запрос

Автор: Akina 8.11.2021, 08:33
Код

WITH cte AS ( SELECT forms.account, forms.author, array_agg(users.name) users
              FROM forms
              CROSS JOIN UNNEST(users) AS users (name)
              GROUP BY forms.account, forms.author )
SELECT json_build_object(author, json_object_agg(account, users)) output
FROM cte
GROUP BY author;

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=4a0c810444c6c2dea63b50803b31cd3f
Ну или так же, но с массивами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)