Посчитать медиану суммы заказа в диалекте без функции MEDIAN
Таблица orders(amount). Верните медиану amount. Считайте, что в диалекте SQL нет функции MEDIAN. Корректно обработайте и нечётное, и чётное число строк (при чётном медиана — среднее двух центральных значений).
-- посчитайте медиану orders.amount без функции MEDIAN
Напишите запрос.
Берут ordered-set агрегат PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount), что интерполирует центральное значение. Без него нумеруют строки по amount и усредняют центральную позицию(и). Обычный AVG даёт среднее, а не медиану.
- ✗Возвращать AVG (среднее) вместо медианы
- ✗Брать одну центральную строку, игнорируя чётный случай
- ✗Считать, что среднее равно медиане после отсева NULL
- →Чем PERCENTILE_DISC отличается от PERCENTILE_CONT здесь?
- →Как посчитать медиану по группам?
The cleanest form is the SQL-standard ordered-set aggregate, supported by Postgres:
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY amount) AS median
FROM orders;
If the dialect truly lacks it, rank the rows and average the central position(s). Averaging the two middle rows works for an even count and still returns the single middle row for an odd count:
WITH ranked AS (
SELECT amount,
ROW_NUMBER() OVER (ORDER BY amount) AS rn,
COUNT(*) OVER () AS n
FROM orders
)
SELECT AVG(amount) AS median
FROM ranked
WHERE rn IN ((n + 1) / 2, (n + 2) / 2);
AVG(amount) over the whole table is the mean, not the median, and a single OFFSET central row silently mishandles even counts.