Нужно вычислить медианную зарплату по каждому отделу в одном запросе. В PostgreSQL нет функции MEDIAN(). Какой синтаксис корректен?

AИспользовать AVG(salary) с условием WHERE salary BETWEEN MIN(salary) AND MAX(salary)
BИспользовать SELECT salary FROM employees ORDER BY salary LIMIT 1 OFFSET COUNT(*)/2 в подзапросе
CИспользовать PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) — упорядоченную агрегатную функцию
DИспользовать (MAX(salary) + MIN(salary)) / 2 — полусумма крайних значений группы
Правильный ответ. PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary) — стандартная упорядоченная агрегатная функция для вычисления медианы, работает с GROUP BY.

Разбор

PERCENTILE_CONT(fraction) WITHIN GROUP (ORDER BY col) — упорядоченная агрегатная функция стандарта SQL:2003. При fraction=0.5 возвращает медиану с линейной интерполяцией. PERCENTILE_DISC(0.5) возвращает ближайшее реальное значение без интерполяции. Обе работают с GROUP BY. (MAX + MIN) / 2 — среднее крайних значений, что не равно медиане при несимметричном распределении.

Проверь себя · 1/3разбор после ответа
Нужно получить количество заказов по паре (user_id, status) из таблицы orders. Какой запрос верный?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»