我的mariadb服务器中有一个json列。我遇到一个问题:我无法对json进行分组。
我尝试使用过程和功能,但是连续失败 我希望包括一些方法,以向比我本人更擅长于此的朋友提供此解决方案
样本数据:
id name json
------------------------------------------------------
1 lorem ipsum {"a":2,"b": 10, "c": 20}
2 lorem ipsum2 {"a":1, "b":8, "c": 21, "d":7}
2 lorem ipsum2 {"b":1, "e":8, "h": 21, "j":7}
现在,我想要这样的输出数据,计算值,然后确定是否将数据从json对象的A增加到Z:
key average max_value min_value sum_value count_data
---------------------------------------------------------
a 1.5 2 1 3 2
b 8.2 10 1 19 3
c 20.5 21 20 41 2
d 7 7 7 7 1
答案 0 :(得分:1)
您的示例数据仅显示4个键的结果,而数据中的结果则更多。如果您想要一组固定键的结果,这是一种解决方案;它使用子查询列出应考虑的键,并在外部查询中使用条件聚合; JSON_EXTRACT
使您可以访问对象的内容:
SELECT
v.val,
AVG(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS average,
MAX(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS max_value,
MIN(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS min_value,
SUM(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS sum_value,
COUNT(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS count_data
FROM t
CROSS JOIN (
SELECT 'a' val UNION ALL SELECT'b' UNION ALL SELECT'c' UNION ALL SELECT'd'
) v
GROUP BY v.val
| val | average | max_value | min_value | sum_value | count_data |
| --- | ------- | --------- | --------- | --------- | ---------- |
| a | 1.5 | 2 | 1 | 3 | 2 |
| b | 6.3333 | 8 | 1 | 19 | 3 |
| c | 20.5 | 21 | 20 | 41 | 2 |
| d | 7 | 7 | 7 | 7 | 1 |
如果您的标记值的范围是a
到z
,则一种解决方案(丑陋但可行)是用更多UNION ALL SELECT
个扩展子查询。