Je propose un moyen plus rapide.
Obtenez le nombre de lignes :
SELECT CEIL(COUNT(*)/2) FROM data;
Prenez ensuite la valeur du milieu dans une sous-requête triée :
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
J'ai testé cela avec un ensemble de données 5x10e6 de nombres aléatoires et il trouvera la médiane en moins de 10 secondes.
Cela trouvera un centile arbitraire en remplaçant le COUNT(*)/2
avec COUNT(*)*n
où n
est le centile (0,5 pour la médiane, 0,75 pour le 75e centile, etc.).