📊 Медиана в SQL: почему она важнее среднего?

Среднее арифметическое (AVG()) часто используется для анализа данных, но иногда оно даёт искажённые результаты.



Например, представьте, что у нас есть 11 сотрудников:

🔹10 человек получают 40 000 💰

🔹1 человек получает 5 000 000 💰



Если посчитать среднюю зарплату, получится:



SELECT AVG(salary) FROM salaries;



👉 Средняя зарплата: 490 000



Но разве это отражает реальность? Большинство сотрудников получают 40 000, а один выбивает статистику.



Медиана (MEDIAN) — это значение, которое делит отсортированные данные пополам: половина значений меньше, половина больше. В данном случае медиана = 40 000, что лучше отражает ситуацию.



📌 Как посчитать медиану в MySQL?

В отличие от AVG(), в MySQL нет встроенной функции MEDIAN(), но её можно посчитать разными способами.



1️⃣ Метод через ORDER BY LIMIT (для нечётного количества записей)

Если записей нечётное количество, медиана — это значение в центре списка:



SELECT salary FROM salaries

ORDER BY salary

LIMIT 1 OFFSET (SELECT COUNT(*) FROM salaries) / 2;



⚠️ Минус: Работает только для нечётного количества записей.



2️⃣ Метод через ROW_NUMBER() (универсальный способ)

Этот метод работает и для чётного, и для нечётного количества записей:



WITH ordered AS (

SELECT salary, ROW_NUMBER() OVER (ORDER BY salary) AS rn,

COUNT(*) OVER () AS total

FROM salaries

)

SELECT AVG(salary) FROM ordered

WHERE rn IN (FLOOR((total + 1) / 2), CEIL((total + 1) / 2));



🔹 Мы нумеруем строки с ROW_NUMBER().

🔹 Выбираем одно или два центральных значения.

🔹 Берём их среднее (AVG()) — для чётного числа записей берётся среднее двух центральных значений.



🏆 Итог

Медиана полезнее среднего арифметического, когда есть выбросы в данных.

В MySQL нет встроенной MEDIAN(), но её можно вычислить с ROW_NUMBER().

Используйте медиану, если хотите честную аналитику! 🚀