Предлагам по-бърз начин.
Вземете броя на редовете:
SELECT CEIL(COUNT(*)/2) FROM data;
След това вземете средната стойност в сортирана подзаявка:
SELECT max(val) FROM (SELECT val FROM data ORDER BY val limit @middlevalue) x;
Тествах това с набор от данни 5x10e6 от произволни числа и той ще намери медианата за по-малко от 10 секунди.
Това ще намери произволен процентил чрез замяна на COUNT(*)/2
с COUNT(*)*n
където n
е процентилът (.5 за медиана, .75 за 75-ти персентил и т.н.).