Postgres 9.6 - создание массива объектов JSON из нескольких столбцов

У меня есть следующий набор данных здесь

http://sqlfiddle.com/

Я хочу создать запрос, результат которого будет следующим:

  • ключ: 1, avg_time_1: [{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 20 }], avg_time_2: [{"category": 10, "avg_time": 20}, {"category": 20, "avg_time": 40}]
  • ключ: 2, avg_time_1: [{ "category": 10, "avg_time": 10},{ "category": 20, "avg_time": 60}], avg_time_2: [{"category": 10, "avg_time": 50}, {"category": 20, "avg_time": 70}]
  • Идея состоит в том, чтобы просто представить значения cols avg_time_1 и avg_time_2 по-другому (значения jsonb)

    1 ответ

    Решение

    Использование jsonb_build_object() строить первоклассные объекты и jsonb_agg() объединить их в массив json:

    select 
        key, 
        jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_1)) as avg_time_1,
        jsonb_agg(jsonb_build_object('category', category, 'avg_time', avg_time_2)) as avg_time_2
    from data_to_agg_json
    group by key
    
     key |                              avg_time_1                              |                              avg_time_2                              
    -----+----------------------------------------------------------------------+----------------------------------------------------------------------
       1 | [{"avg_time": 10, "category": 10}, {"avg_time": 30, "category": 20}] | [{"avg_time": 20, "category": 10}, {"avg_time": 40, "category": 20}]
       2 | [{"avg_time": 10, "category": 10}, {"avg_time": 60, "category": 20}] | [{"avg_time": 50, "category": 10}, {"avg_time": 70, "category": 20}]
    (2 rows)    
    

    SqlFiddle.

    Другие вопросы по тегам