Potrebbe essere necessario calcolare la mediana di un insieme di numeri come vendite, ecc. per trovare il valore di transazione tipico di una variabile. È necessario calcolare la mediana in MySQL utilizzando le query SQL poiché non esiste una funzione per questo. Ecco una semplice query per calcolare la mediana in MySQL.
Come calcolare la mediana in MySQL
Ecco i passaggi per calcolare la mediana in MySQL. Supponiamo che tu abbia la seguente tabella
CREATE TABLE exams ( id int(11) NOT NULL auto_increment, dt date, score int, PRIMARY KEY (id) ); insert into exams (dt,score) values ('2019-01-01',70); insert into exams (dt,score) values ('2019-02-01',77); insert into exams (dt,score) values ('2019-03-01',71); insert into exams (dt,score) values ('2019-04-01',70); insert into exams (dt,score) values ('2019-05-01',89); insert into exams (dt,score) values ('2019-06-01',87); insert into exams (dt,score) values ('2019-07-01',88); insert into exams (dt,score) values ('2019-08-01',89); mysql> select * from exams; +------+------------+-------+ | id | dt | score | +------+------------+-------+ | 1 | 2019-01-01 | 70 | | 2 | 2019-02-01 | 77 | | 3 | 2019-03-01 | 71 | | 4 | 2019-04-01 | 70 | | 5 | 2019-05-01 | 89 | | 6 | 2019-06-01 | 87 | | 7 | 2019-07-01 | 88 | | 8 | 2019-08-01 | 89 | +------+------------+-------+
Diciamo che vuoi trovare il punteggio mediano per il tavolo. Mediana è il valore dell'elemento centrale in una matrice di numeri che è stata ordinata. Se l'array ha un numero pari di elementi, la mediana è la media dei 2 valori centrali.
Calcola la mediana in MySQL
Ecco la query SQL per calcolare la mediana per la colonna del punteggio
SELECT AVG(dd.score) as median_val FROM ( SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum FROM exams d, (SELECT @rownum:=0) r WHERE d.score is NOT NULL -- put some where clause here ORDER BY d.score ) as dd WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) ); +------------+ | median_val | +------------+ | 82.00 | +------------+
Diamo un'occhiata alla query di cui sopra in dettaglio. In questo caso utilizziamo una sottoquery SQL. La query interna assegna @rownum come indice incrementale e ordina i valori selezionati. Alla fine del primo passaggio, @total_rows conterrà il conteggio delle righe selezionate. La query esterna utilizza @total_rows per determinare la mediana, indipendentemente dal fatto che ci siano numeri pari o dispari di valori.
Calcola la mediana in MySQL dopo aver applicato il filtro
Supponiamo di voler calcolare la mediana solo per i valori maggiori di 80 (>80). Puoi farlo semplicemente aggiungendo una clausola where alla tua query sopra, come mostrato di seguito (condizione del filtro menzionata in grassetto )
SELECT AVG(dd.score) as median_val FROM ( SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum FROM exams d, (SELECT @rownum:=0) r WHERE d.score is NOT NULL AND d.score>80 ORDER BY d.score ) as dd WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) ); +------------+ | median_val | +------------+ | 88.50 | +------------+
Come tracciare la linea mediana su un grafico/report
Supponiamo che tu voglia visualizzare il valore mediano lungo i valori dei dati laterali nel tuo rapporto. In tal caso, puoi semplicemente eseguire un'unione incrociata della tabella dei risultati mediani con la tabella dei dati originale, come mostrato di seguito.
select * from exams, ( SELECT AVG(dd.score) as median_val FROM ( SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum FROM exams d, (SELECT @rownum:=0) r WHERE d.score is NOT NULL -- put some where clause here ORDER BY d.score ) as dd WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) ) ) temp; +------+------------+-------+------------+ | id | dt | score | median_val | +------+------------+-------+------------+ | 1 | 2019-01-01 | 70 | 82.0000 | | 2 | 2019-02-01 | 77 | 82.0000 | | 3 | 2019-03-01 | 71 | 82.0000 | | 4 | 2019-04-01 | 70 | 82.0000 | | 5 | 2019-05-01 | 89 | 82.0000 | | 6 | 2019-06-01 | 87 | 82.0000 | | 7 | 2019-07-01 | 88 | 82.0000 | | 8 | 2019-08-01 | 89 | 82.0000 | +------+------------+-------+------------+
Nella query precedente, abbiamo eseguito un cross join tra esami tabella con il risultato della query mediana (etichettata come temp )
Ecco un esempio dei dati sopra riportati su un grafico a linee, creato utilizzando Ubiq.
È possibile personalizzare le query di cui sopra in base alle proprie esigenze per calcolare la mediana in MySQL. Cordiali saluti, MariaDB fornisce una funzione pronta all'uso MEDIAN() per calcolare i media per una colonna di valori.
Se vuoi creare grafici, dashboard e report dal database MySQL, puoi provare Ubiq. Offriamo una prova gratuita di 14 giorni.