Обычные агрегаты в SQL не гарантируют порядок входных данных, что важно для медиан и упорядоченных списков. Конструкция
WITHIN GROUP решает это, задавая порядок элементов внутри агрегатной функции.Пример: соберём список продуктов по категории в порядке убывания продаж:
SELECT
category_id,
LISTAGG(product_name, ', ') WITHIN GROUP (ORDER BY total_sales DESC) AS top_products
FROM product_sales
GROUP BY category_id;
В отличие от
ARRAY_AGG(product_name ORDER BY ...), синтаксис WITHIN GROUP используется для ordered-set функций, а не для любых агрегатов.Пример вычисления порогового значения 90% по сумме заказов по регионам:
SELECT
region_id,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY total_amount) AS p90_sales
FROM orders
GROUP BY region_id;
PERCENTILE_CONT() и PERCENTILE_DISC() позволяют вычислять медиану или любое процентное значение без оконных функций.Медиана чека по каждому магазину:
SELECT
store_id,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_amount) AS median_check
FROM orders
GROUP BY store_id;
Такой подход может быть проще и эффективнее, чем использование
NTILE() или RANK() в оконных выражениях.🔥 Используйте
WITHIN GROUP, когда важен порядок в агрегатах.➡️ SQL Ready | #практика