Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment calculer la médiane dans MySQL

Vous devrez peut-être calculer la médiane d'un ensemble de nombres tels que les ventes, etc. pour trouver la valeur de transaction typique d'une variable. Vous devez calculer la médiane dans MySQL à l'aide de requêtes SQL car il n'y a pas de fonction pour cela. Voici une requête simple pour calculer la médiane dans MySQL.

Comment calculer la médiane dans MySQL

Voici les étapes pour calculer la médiane dans MySQL. Disons que vous avez le tableau suivant

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

Supposons que vous souhaitiez trouver le score médian du tableau. La médiane est la valeur de l'élément du milieu dans un tableau de nombres qui a été trié. Si le tableau a un nombre pair d'éléments, la médiane est la moyenne des 2 valeurs du milieu.

Calculer la médiane dans MySQL

Voici la requête SQL pour calculer la médiane de la colonne de score

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

Examinons en détail la requête ci-dessus. Nous utilisons une sous-requête SQL dans ce cas. La requête interne affecte @rownum comme index incrémentiel et trie les valeurs sélectionnées. À la fin de la première passe, @total_rows contiendra le nombre de lignes des lignes sélectionnées. La requête externe utilise @total_rows pour déterminer la médiane, qu'il y ait un nombre pair ou impair de valeurs.

Calculer la médiane dans MySQL après avoir appliqué le filtre

Supposons que vous souhaitiez calculer la médiane uniquement pour les valeurs supérieures à 80 (> 80). Vous pouvez le faire en ajoutant simplement une clause where à votre requête ci-dessus, comme indiqué ci-dessous (condition de filtre mentionnée en gras )

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

Comment tracer une ligne médiane sur un graphique/rapport

Supposons que vous souhaitiez afficher la valeur médiane à côté des valeurs de données latérales sur votre rapport. Dans ce cas, vous pouvez simplement effectuer une jointure croisée de votre tableau de résultats médians avec votre tableau de données d'origine, comme indiqué ci-dessous.

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

Dans la requête ci-dessus, nous avons effectué une jointure croisée entre les examens tableau avec le résultat de la requête médiane (étiqueté comme temp )

Voici un exemple des données ci-dessus tracées sur un graphique linéaire, créé à l'aide d'Ubiq.

Vous pouvez personnaliser les requêtes ci-dessus selon vos besoins pour calculer la médiane dans MySQL. Pour votre information, MariaDB fournit une fonction prête à l'emploi MEDIAN() pour calculer les médias pour une colonne de valeurs.

Si vous souhaitez créer des graphiques, des tableaux de bord et des rapports à partir de la base de données MySQL, vous pouvez essayer Ubiq. Nous offrons un essai gratuit de 14 jours.