Представлять данные запроса в другом формате - PostgreSQL

У меня есть запрос, который представляет результаты следующим образом:

{"declined": [{"2018-01-16": 1}], "negative": [{"2018-01-16": 1}], "positive": [{"2018-01-16": 2}]}

запрос выглядит так:

select 
jsonb_build_object('positive', 
  json_agg(jsonb_build_object(date, positive)) FILTER (WHERE positive <> 0)
) ||
jsonb_build_object('negative',
  json_agg( jsonb_build_object(date, negative)) FILTER (WHERE negative <> 0)
) ||
jsonb_build_object('declined', 
  json_agg(jsonb_build_object(date, declined)) FILTER (WHERE declined <> 0)
)
from (
SELECT
  date(survey_results.created_at) as date,
  COUNT(*) FILTER (WHERE (scores#>>'{medic,social,total}' in('high','medium'))) AS positive,
  COUNT(*) FILTER (WHERE (scores#>>'{medic,social,total}' in('low'))) AS negative,
  COUNT(*) FILTER (WHERE (coalesce(raw#>>'{survey,denied}','f') = 'true')) AS declined
  FROM survey_results
  GROUP BY date(survey_results.created_at)
) as t1;

Я пытаюсь реорганизовать этот запрос, чтобы вернуть мне JSON, который выглядит следующим образом:

{"2018-01-16": {"positive": 2, "declined": "1", "negative": 1}}

Как я могу это сделать? Вот sql fiddle, с которым вы можете поэкспериментировать:

http://sqlfiddle.com/

Заранее спасибо.

1 ответ

Решение

Я, наверное, скучаю по чему-то - я просто jsonb_build_object на jsonb_build_object:

select 
jsonb_build_object(date,jsonb_build_object('positive',positive,'negative',negative,'declined',declined))
from (
SELECT
  date(survey_results.created_at) as date,
  COUNT(*) FILTER (WHERE (scores#>>'{medic,social,total}' in('high','medium'))) AS positive,
  COUNT(*) FILTER (WHERE (scores#>>'{medic,social,total}' in('low'))) AS negative,
  COUNT(*) FILTER (WHERE (coalesce(raw#>>'{survey,denied}','f') = 'true')) AS declined
  FROM survey_results
  GROUP BY date(survey_results.created_at)
) t1

и результат:

{"2018-01-16": {"declined": 1, "negative": 1, "positive": 2}}

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