Eu proponho uma maneira mais rápida.
Obtenha a contagem de linhas:
SELECT CEIL(COUNT(*)/2) FROM data; Em seguida, pegue o valor do meio em uma subconsulta classificada:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x; Eu testei isso com um conjunto de dados 5x10e6 de números aleatórios e ele encontrará a mediana em menos de 10 segundos.
Isso encontrará um percentil arbitrário substituindo o
COUNT(*)/2 com COUNT(*)*n onde n é o percentil (0,5 para mediana, 0,75 para 75º percentil, etc).