Propongo un modo più veloce.
Ottieni il conteggio delle righe:
SELECT CEIL(COUNT(*)/2) FROM data;
Quindi prendi il valore medio in una sottoquery ordinata:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
L'ho testato con un set di dati 5x10e6 di numeri casuali e troverà la mediana in meno di 10 secondi.
Questo troverà un percentile arbitrario sostituendo COUNT(*)/2
con COUNT(*)*n
dove n
è il percentile (.5 per la mediana, .75 per il 75° percentile, ecc.).