sql >> Databasteknik >  >> RDS >> Mysql

MySQL aggregerad summa av JSON-objekt

Uppdatering:Okej

För det första skulle jag definitivt rekommendera att normalisera data lite. Har du testat att bara lagra objekten i detaljkolumnen? Om du behövde lagra grupper av data med varje prov-id kan du använda en relaterande tabell. IE:)

Exempel

id int automatisk ökning

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

Detaljer

sample_id intrecord json

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

Fyll i dina uppgifter

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"}');

Då kan du göra något liknande

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 

Resultat

+---------------------------------------------------------------------+
| (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}                        |
+---------------------------------------------------------------------+

Om du inte vill (eller inte kan) använda en normaliserad datamängd, kanske du kan titta på att skriva en lagrad procedur som går över dina detaljkolumner och aggregerar data för var och en, med en fråga som aggregerar de två datauppsättningar.



  1. anslutning av MATLAB 7.0 och MYSQL

  2. docker container körning kräver minst ett argument

  3. Dumpa sql-filen till ClearDB i Heroku

  4. Bygg om modellen utan förlust av data i MySQL för Symfony