MySQL, obtener mediana

From Wiki de Caballero
Jump to navigation Jump to search

Solución

Suponiendo que queremos la mediana de nota (grade) de una tabla grades podemos ejecutar el siguiente query.

SET @rowindex := -1;
 
SELECT
   AVG(g.grade)
FROM
   (SELECT @rowindex:=@rowindex + 1 AS rowindex,
           grades.grade AS grade
    FROM grades
    ORDER BY grades.grade) AS g
WHERE
g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));

Explicación

El siguiente query obtiene la lista de grade (nota) ordenada por nota y con un indice asociado a cada nota. En indice debe empezar en -1.

SET @rowindex := -1;

SELECT @rowindex:=@rowindex + 1 AS rowindex,
    grades.grade AS grade
FROM grades
ORDER BY grades.grade

La sección final filtra del total de indices los de la mitad, si son impares va a ser uno solo, si son pares con dos. Uno arriba de la mitad y otro abajo.

(...)
g.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));

Finalmente se obtiene el promedio entre las dos (en caso de que sea una cantidad par) notas que están en la mitad o el promedio entre una sola (en caso de que sea una cantidad impar).


Source

Source: How to calculate median value in MySQL using a simple SQL query