К сожалению, ни ответы TheJacobTaylor, ни ответы velcro не дают точных результатов для текущих версий MySQL.
Ответ на Velcro сверху близок, но он не вычисляет правильно для наборов результатов с четным числом строк. Медианы определяются как 1) среднее число на нечетных нумерационных множествах, или 2) среднее из двух средних чисел на четных наборах чисел.
Итак, вот решение velcro, исправленное для обработки как нечетного, так и четного числа sets:
SELECT AVG(middle_values) AS 'median' FROM (
SELECT t1.median_column AS 'middle_values' FROM
(
SELECT @row:=@row+1 as `row`, x.median_column
FROM median_table AS x, (SELECT @row:=0) AS r
WHERE 1
-- put some where clause here
ORDER BY x.median_column
) AS t1,
(
SELECT COUNT(*) as 'count'
FROM median_table x
WHERE 1
-- put same where clause here
) AS t2
-- the following condition will return 1 record for odd number sets, or 2 records for even number sets.
WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3;
Чтобы использовать это, выполните следующие 3 простых шага:
Вы можете:
Создать свой фрейм данных (набор данных - это фрейм данных, в противоположность набору данных чего-либо еще) со всеми дополнительными столбцами до, а затем выполнить агрегирование на вновь созданные столбцы. Вы можете создать столбцы в цикле.
Создайте UDAF (пользовательскую функцию агрегирования), которая будет обрабатывать ваш пользовательский код на Java.
Надеюсь, это поможет ...