Ya no busques más en otras páginas porque llegaste al lugar exacto, poseemos la respuesta que quieres hallar pero sin liarte.
Solución:
Propongo una forma más rápida.
Obtener el recuento de filas:
SELECT CEIL(COUNT(*)/2) FROM data;
Luego tome el valor medio en una subconsulta ordenada:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Probé esto con un conjunto de datos de números aleatorios de 5x10e6 y encontrará la mediana en menos de 10 segundos.
Esto encontrará un percentil arbitrario reemplazando el COUNT(*)/2
con COUNT(*)*n
dónde n
es el percentil (0,5 para la mediana, 0,75 para el percentil 75, etc.).
val
es tu columna de tiempo, x
y y
son dos referencias a la tabla de datos (puedes escribir data AS x, data AS y
).
EDITAR: Para evitar calcular sus sumas dos veces, puede almacenar los resultados intermedios.
CREATE TEMPORARY TABLE average_user_total_time
(SELECT SUM(time) AS time_taken
FROM scores
WHERE created_at >= '2010-10-10'
and created_at <= '2010-11-11'
GROUP BY user_id);
Luego puede calcular la mediana sobre estos valores que se encuentran en una tabla con nombre.
EDITAR: la tabla temporal no funcionará aquí. Puede intentar usar una tabla normal con el tipo de tabla "MEMORIA". O simplemente tenga su subconsulta que calcule los valores de la mediana dos veces en su consulta. Aparte de esto, no veo otra solución. Esto no significa que no haya una mejor manera, tal vez alguien más venga con una idea.