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


Автор: polin11 23.6.2025, 23:33
Сгруппировать в JSON данные

Использую СУБД 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  

Автор: Akina 24.6.2025, 15:40
Код

WITH 
cte1 (UserName, UserDate, UserAmount) AS (
  SELECT "User", UserDate, COUNT(UserDate) 
  FROM Users
  GROUP BY 1, 2
  ),
cte2 (UserName, UserJSON) AS (
  SELECT UserName, json_object_agg(UserDate, UserAmount)
  FROM cte1
  GROUP BY 1
  )
SELECT json_object_agg(UserName, UserJSON) AS FinalJSON
FROM cte2;

https://dbfiddle.uk/9bhz0FYY

Цитата(polin11 @  24.6.2025,  00:33 Найти цитируемый пост)
Нужно просто json значения которого тоже json  

Не бывает "просто JSON". Или объект, или массив. Или не JSON.

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