#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));
Объяснение:
- Давайте начнем с внутреннего подзапроса — подвыборка присваивает @rowindex в качестве инкрементного индекса для каждой выбранной зарплаты и сортирует зарплаты.
- Как только у нас будет отсортированный список зарплат, внешний запрос извлечет средние элементы в массиве. Если массив содержит нечетное количество элементов, оба значения будут единственным средним значением.
- Затем предложение 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)