Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL aggregierte Summe von JSON-Objekten

Update:Okay

Zunächst würde ich auf jeden Fall empfehlen, die Daten ein wenig zu normalisieren. Haben Sie versucht, nur die Objekte in der Detailspalte zu speichern? Wenn Sie Datengruppen mit jeder Proben-ID speichern müssen, können Sie eine entsprechende Tabelle verwenden. IE:)

Beispiel

id int automatisches Inkrement

mysql> create table Sample (id int(11) not null auto_increment, primary key(id));

Einzelheiten

sample_id intrecord json

mysql> create table Details (sample_id int(11), record json);

Geben Sie Ihre Daten ein

insert into Sample (id) values (1);
insert into Sample (id) values (2);

insert into Details (sample_id, record) values 
  (1, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'), 
  (1, '{"id": 3, "name": "T3", "amount": "30.34", "percentage": "45"}'), 
  (1, '{"id": 2, "name": "T2", "amount": "14.34", "percentage": "15"}');

insert into Details (sample_id, record) values 
  (2, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'),
  (2, '{"id": 2, "name": "T2", "amount": "30.34", "percentage": "45"}'),
  (2, '{"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}');

Dann können Sie so etwas tun wie

SELECT (
  JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)
) FROM (
  SELECT 
    JSON_EXTRACT(record, "$.id") as id, 
    SUM(JSON_EXTRACT(record, "$.amount")) as amount, 
    AVG(JSON_EXTRACT(record, "$.percentage")) as percentage
  FROM Details 
  GROUP BY JSON_EXTRACT(record, "$.id")
) as t 

Ergebnisse

+---------------------------------------------------------------------+
| (JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)) |
+---------------------------------------------------------------------+
| {"id": 1, "amount": 68.68, "percentage": 45}                        |
| {"id": 2, "amount": 44.68, "percentage": 30}                        |
| {"id": 3, "amount": 30.34, "percentage": 45}                        |
| {"id": 4, "amount": 14.34, "percentage": 15}                        |
+---------------------------------------------------------------------+

Wenn Sie kein normalisiertes Dataset verwenden möchten (oder können), könnten Sie sich vielleicht überlegen, eine gespeicherte Prozedur zu schreiben, die Ihre Detailspalten durchläuft und die Daten für jede Spalte mit einer Abfrage aggregiert, die die beiden aggregiert Datensätze.