Выполнение агрегации с использованием JSON1 и SQLite3 в объектах Json - PullRequest
0 голосов
/ 18 сентября 2018

Я только начал использовать SQLite 3 с поддержкой JSON1.

Я уже создал базу данных, которая состоит из нескольких атрибутов.Одним из этих атрибутов является объект json.

Что я хочу сделать, это выполнить агрегирование внутри этого объекта.

Выполнение следующего запроса:

select json_extract(report, '$.some_attribute')
from table1
group by var1
having date == max(date);

возвращает следующее:

[{"count":55,"label":"A"},{"count":99,"label":"B"}, {"count":1,"label":"C"}]
[{"count":29,"label":"A"},{"count":285,"label":"B"},{"count":461,"label":"C"}]
[{"count":6642,"label":"A"},{"count":24859,"label":"B"},{"count":3031,"label":"C"}]
[{"count":489,"label":"A"},{"count":250,"label":"B"},{"count":74,"label":"C"}]

Теперь я хочу сгруппировать по метке и, например, sum count key.

Вывод должен выглядеть примерно так:

[{"label": A, 'count': 7215},
 {"label": B, 'count': 25493},
 {"label": C, 'count': 3567}]

ИЛИ так:

  A,       B,     C
7215,    25493,  3567

Я пытался реализовать последний вариант так:

select sum(A) as A, sum(B) as B, sum(C) as C
from (
select json_extract(report,
                '$.some_attribute[0].count') as A,
       json_extract(report,
                '$.some_attribute[1].count') as B,
       json_extract(report,
                '$.some_attribute[0].count') as C
from table1
group by var1
having date == max(date));

Дело в том, как вы можете быть уверены, что все объекты в массиве будут отсортированы одинаково.Так что это может вызвать проблемы.

Есть решения?спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Если вы «разложите» строки json, возвращенные из первого json_extract, как и в случае json_each , это станет тривиальным.Это сработало в моем воспроизведении:

WITH result as (select jsonString from jsonPlay)
select json_extract(value,'$.label') label,SUM(json_extract(value,'$.count'))
from result,json_each(jsonString) 
group by label

Дать такой результат:

 A| 7215
 B| 25493
 C| 3567

По сути, ваш select json_extract(report, '$.some_attribute') блок заменяет select jsonString from jsonPlay

Вы можете использовать это для"колонизировать" это, как в вашем варианте ИЛИ.

WITH result as (select jsonString from jsonPlay) 
select SUM(CASE WHEN json_extract(value,'$.label')='A' then json_extract(value,'$.count') END) 'A', 
SUM(CASE WHEN json_extract(value,'$.label')='B' then json_extract(value,'$.count') END) 'B', 
SUM(CASE WHEN json_extract(value,'$.label')='C' then json_extract(value,'$.count') END) 'C'
from result,json_each(jsonString)
...