Saya mengusulkan cara yang lebih cepat.
Dapatkan jumlah baris:
SELECT CEIL(COUNT(*)/2) FROM data;
Kemudian ambil nilai tengah dalam subquery yang diurutkan:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Saya menguji ini dengan kumpulan data 5x10e6 angka acak dan akan menemukan median dalam waktu kurang dari 10 detik.
Ini akan menemukan persentil arbitrer dengan mengganti COUNT(*)/2
dengan COUNT(*)*n
dimana n
adalah persentil (.5 untuk median, .75 untuk persentil ke-75, dst).