Mysql
 sql >> Database >  >> RDS >> Mysql

Come calcolare la mediana in MySQL

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.