| Начало » Использование СУБД » PostgreSQL » Сгруппировать в JSON данные (Сгруппировать в JSON данные) Переход к форуму:
	| 
		
			| Сгруппировать в JSON данные [сообщение #6125] | Mon, 23 June 2025 23:28  |  
			| 
				
				
					|  polin11 Сообщений: 9
 Зарегистрирован: January 2023
 | Junior Member |  |  |  
	| Использую СУБД PostgreSQL. Просьба помочь написать сложный запрос,
 есть таблица Users
 
 В итоге нужен json видаUser   UserDate
Петя   2024-01-01
Петя   2024-01-01
Петя   2026-01-01
Ваня   2025-01-02
Ваня   2025-01-02
Игорь  2025-06-10
 Моих знаний хватило только на такой запрос:{
   Петя: {
       '2024-01-01': 2,
	   '2026-01-01': 1
   }.
   Ввня: {
       '2025-01-02': 2
   }
   Игорь: {
	    '2025-06-10': 1
   }
} 
 Тут в итоге получается массив json, внутри тоже массив из json.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
 |  
	|  |  |  
	| 
		
			| Re: Сгруппировать в JSON данные [сообщение #6129 является ответом на сообщение #6125] | Wed, 25 June 2025 21:35  |  
			| 
				
				
					|  BlackEric Сообщений: 393
 Зарегистрирован: June 2022
 | Senior Member |  |  |  
	| Но странноват у вас json./*  Исходная таблица
     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; |  
	|  |  | 
 
 
 Текущее время: Fri Oct 31 15:28:40 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00750 секунд |