SQLRU.net - RDF-канал
type: channel
description: Разработка приложений баз данных
items: Сгруппировать в JSON данные
items: Re: Сгруппировать в JSON данные

Сгруппировать в JSON данные
type: item
description: Использую СУБД PostgreSQL. Просьба помочь написать сложный запрос, есть таблица Users User UserDate Петя 2024-01-01 Петя 2024-01-01 Петя 2026-01-01 Ваня 2025-01-02 Ваня 2025-01-02 Игорь 2025-06-10 В итоге нужен json вида { Петя: { '2024-01-01': 2, '2026-01-01': 1 }. Ввня: { '2025-01-02': 2 } Игорь: { '2025-06-10': 1 } } Моих знаний хватило только на такой запрос: WITH tmp AS( SELECT COUNT(*) AS "kolvo", "UserData" "User" FROM "Users" GROUP BY "User", "UserData" ), tmp1 AS( SELECT "User", array_agg( json_build_object( "UserDate"::text, "Kol" ) ) AS "user_json" GROUP BY "User" ) SELECT array_agg( json_build_object( "User", "user_json" ) ) FROM tmp1 Тут в итоге получается массив json, внутри тоже массив из json. Нужно просто json значения которого тоже json
creator: polin11
date: 2025-06-23T20:28:29-00:00

Re: Сгруппировать в JSON данные
type: item
description: /* Исходная таблица t("User" text, "UserDate" date) */ WITH cnt AS ( -- 1. считаем повторы «дата-пользователь» SELECT "User" AS usr, "UserDate" AS dt, COUNT(*) AS qty FROM t GROUP BY "User", "UserDate" ), usr_json AS ( -- 2. собираем JSON-объект по каждой персоне SELECT usr, jsonb_object_agg(dt::text, qty) AS dates_json FROM cnt GROUP BY usr ) SELECT jsonb_object_agg(usr, dates_json) AS result -- 3. общий объект FROM usr_json; Но странноват у вас json.
creator: BlackEric
date: 2025-06-25T18:35:14-00:00