Поиск медианы в mysql с помощью group_concat
Запрос:
SELECT
IF(count%2=1,
SUBSTRING_INDEX(substring_index(data_str,",",pos),",",-1),
(SUBSTRING_INDEX(substring_index(data_str,",",pos),",",-1)
+ SUBSTRING_INDEX(substring_index(data_str,",",pos+1),",",-1))/2)
as median
FROM (SELECT group_concat(val order by val) data_str,
CEILING(count(*)/2) pos,
count(*) as count from data)temp;
Пояснение:
Сортировка выполняется по порядку внутри функции group_concat
Позиция (pos) и Общее количество элементов (count) определены. CEILING для определения позиции помогает нам использовать функцию substring_index в следующих шагах.
На основании количества определяется четное или нечетное количество значений.
- Нечетные значения: напрямую выберите элемент, принадлежащий к позиции, используя substring_index.
- Четные значения: найдите элемент, принадлежащий pos и pos + 1, затем сложите их и разделите на 2, чтобы получить медиану.
Наконец, вычисляется медиана.