Как группировать ключи Json, Sum и динамически? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть столбец json на моем сервере mariadb.У меня проблема: я не могу сгруппировать 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}

Теперь мне нужны выходные данные, подобные этим, рассчитайте значение и динамически, если данные увеличатся от A до Z объекта json:

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

1 Ответ

0 голосов
/ 24 февраля 2019

В ваших данных приведены результаты только для 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   

Демонстрация на DB Fiddle :

| 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 s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...