Нужно вычислить медианную зарплату по каждому отделу в одном запросе. В 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. При значении 0.5 возвращает медиану с линейной интерполяцией между соседними значениями. Аналог PERCENTILE_DISC(0.5) возвращает ближайшее реальное значение без интерполяции. Обе работают вместе с GROUP BY. Полусумма MAX и MIN равна медиане только в симметричном распределении, а вариант с LIMIT/OFFSET не работает внутри агрегации по отделам.

Проверь себя · 1/3разбор после ответа
Что делает оператор DISTINCT в SELECT-запросе?
Тренировать SQL в Telegram

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