sql >> Base de Datos >  >> RDS >> Mysql

Cómo calcular la mediana en MySQL

Es posible que deba calcular la mediana de un conjunto de números, como ventas, etc., para encontrar el valor de transacción típico de una variable. Debe calcular la mediana en MySQL usando consultas SQL ya que no hay una función para ello. Aquí hay una consulta simple para calcular la mediana en MySQL.

Cómo calcular la mediana en MySQL

Estos son los pasos para calcular la mediana en MySQL. Digamos que tienes la siguiente tabla

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

Supongamos que desea encontrar la puntuación media de la tabla. La mediana es el valor del elemento central en una matriz de números que se ha ordenado. Si la matriz tiene un número par de elementos, la mediana es el promedio de los 2 valores centrales.

Calcular la mediana en MySQL

Aquí está la consulta SQL para calcular la mediana de la columna de puntuación

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

Veamos la consulta anterior en detalle. Usamos una subconsulta SQL en este caso. La consulta interna asigna @rownum como índice incremental y ordena los valores seleccionados. Al final del primer paso, @total_rows contendrá el recuento de filas de las filas seleccionadas. La consulta externa usa @total_rows para determinar la mediana, independientemente de si hay un número par o impar de valores.

Calcular la mediana en MySQL después de aplicar el filtro

Supongamos que desea calcular la mediana solo para valores superiores a 80 (>80). Puede hacerlo simplemente agregando una cláusula where a su consulta anterior, como se muestra a continuación (la condición de filtro se menciona en negrita). )

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

Cómo trazar la línea mediana en un gráfico/informe

Supongamos que desea mostrar el valor de la mediana junto con los valores de datos secundarios en su informe. En ese caso, simplemente puede hacer una combinación cruzada de su tabla de resultados de la mediana con su tabla de datos original, como se muestra a continuación.

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

En la consulta anterior, hemos realizado una unión cruzada entre exámenes tabla con el resultado de la consulta mediana (etiquetada como temp )

Este es un ejemplo de los datos anteriores representados en un gráfico de líneas, creado con Ubiq.

Puede personalizar las consultas anteriores según sus requisitos para calcular la mediana en MySQL. FYI, MariaDB proporciona una función lista para usar MEDIAN() para calcular los medios para una columna de valores.

Si desea crear gráficos, paneles e informes desde la base de datos MySQL, puede probar Ubiq. Ofrecemos una prueba gratuita de 14 días.