
Среднее арифметическое (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().
✅ Используйте медиану, если хотите честную аналитику! 🚀