Выполнение агрегации с использованием JSON1 и SQLite3 в объектах Json
Я только начал использовать 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"}]
Теперь я хочу сгруппировать по ключу метки и, например, суммировать ключ счета.
Вывод должен быть примерно таким:
[{"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 ответ
Если вы удалите гнездо, строки 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
Дать этот результат:
| 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)