Эффективный способ получить медиану в неиндексированной таблице

#mysql

#mysql

Вопрос:

Я пытаюсь найти среднюю зарплату в этой таблице.

Существует ли агрегированная функция, подобная AVG(), для эффективного поиска медианы в неиндексированной таблице? Спасибо.

 id | Salary 
-----------
1    300
2    250
7    180
8    150
9    150
10   160
11   180
15   140
 

Комментарии:

1. Что такое медиана в вашем случае? показать желаемый результат с пояснениями.

Ответ №1:

В MySQL нет MEDIAN() функции, но есть несколько простой способ ее вычисления, как показано на этом веб-сайте:

https://www.eversql.com/how-to-calculate-median-value-in-mysql-using-a-simple-sql-query/

Предполагая, что ваша таблица имеет имя salaries :

 SET @rowindex := -1;
 
SELECT
   AVG(salary)
FROM
   (SELECT @rowindex:=@rowindex   1 AS rowindex,
           salaries.salary AS salary
    FROM salaries
    ORDER BY salaries.salary) AS s
WHERE
s.rowindex IN (FLOOR(@rowindex / 2) , CEIL(@rowindex / 2));
 

Объяснение:

  1. Давайте начнем с внутреннего подзапроса — подвыборка присваивает @rowindex в качестве инкрементного индекса для каждой выбранной зарплаты и сортирует зарплаты.
  2. Как только у нас будет отсортированный список зарплат, внешний запрос извлечет средние элементы в массиве. Если массив содержит нечетное количество элементов, оба значения будут единственным средним значением.
  3. Затем предложение SELECT внешнего запроса возвращает среднее значение этих двух значений в качестве медианного значения.

Ответ №2:

 select avg(Salary)
from
(
select *,
         ROW_NUMBER() over (order by Salary desc) as desc_salary,
         ROW_NUMBER() over (order by Salary asc) as asc_salary
from Table_Name 
) as a
where asc_salary in (desc_salary,desc_salary 1, desc_salary-1)