Advanced aggregation and analytical functions

Maria Garcia Feb 2026
2 tabs
-- ROLLUP for hierarchical subtotals
SELECT
  COALESCE(category, 'ALL CATEGORIES') AS category,
  COALESCE(subcategory, 'ALL SUBCATEGORIES') AS subcategory,
  SUM(revenue) AS total_revenue,
  COUNT(*) AS order_count
FROM sales
GROUP BY ROLLUP(category, subcategory)
ORDER BY category NULLS FIRST, subcategory NULLS FIRST;

-- Result includes:
-- Total for each (category, subcategory)
-- Subtotal for each category
-- Grand total

-- CUBE for all grouping combinations
SELECT
  COALESCE(region, 'ALL') AS region,
  COALESCE(product, 'ALL') AS product,
  COALESCE(quarter, 'ALL') AS quarter,
  SUM(revenue) AS revenue
FROM sales
GROUP BY CUBE(region, product, quarter);

-- GROUPING SETS for specific combinations
SELECT
  category,
  brand,
  color,
  SUM(revenue) AS revenue
FROM products
GROUP BY GROUPING SETS (
  (category, brand),
  (category, color),
  (brand, color),
  ()
);

-- FILTER clause for conditional aggregation
SELECT
  product_id,
  COUNT(*) AS total_orders,
  COUNT(*) FILTER (WHERE status = 'completed') AS completed_orders,
  COUNT(*) FILTER (WHERE status = 'cancelled') AS cancelled_orders,
  SUM(total) AS total_revenue,
  SUM(total) FILTER (WHERE created_at >= CURRENT_DATE - 30) AS revenue_last_30_days,
  AVG(total) FILTER (WHERE total > 100) AS avg_large_order
FROM orders
GROUP BY product_id;

-- String aggregation
SELECT
  user_id,
  STRING_AGG(product_name, ', ' ORDER BY created_at DESC) AS recent_purchases,
  STRING_AGG(DISTINCT category, ' | ') AS categories_purchased
FROM orders
GROUP BY user_id;

-- JSON aggregation
SELECT
  category,
  JSON_AGG(
    JSON_BUILD_OBJECT(
      'id', id,
      'name', name,
      'price', price,
      'stock', stock
    ) ORDER BY price DESC
  ) AS products
FROM products
GROUP BY category;

-- Array aggregation
SELECT
  user_id,
  ARRAY_AGG(order_id ORDER BY created_at DESC) AS order_ids,
  ARRAY_AGG(DISTINCT product_category) AS categories
FROM orders
GROUP BY user_id;

-- Ordered-set aggregates (percentiles)
SELECT
  product_category,
  PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price) AS median_price,
  PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY price) AS q1_price,
  PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY price) AS q3_price,
  PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY price) AS p95_price,
  MODE() WITHIN GROUP (ORDER BY brand) AS most_common_brand
FROM products
GROUP BY product_category;

-- Multiple percentiles at once
SELECT
  category,
  PERCENTILE_CONT(ARRAY[0.25, 0.5, 0.75, 0.95])
    WITHIN GROUP (ORDER BY price) AS price_percentiles
FROM products
GROUP BY category;

-- Hypothetical-set aggregates
SELECT
  RANK(250.00) WITHIN GROUP (ORDER BY salary DESC) AS rank_if_salary_was_250k,
  PERCENT_RANK(250.00) WITHIN GROUP (ORDER BY salary DESC) AS percentile_rank
FROM employees;

-- DISTINCT in aggregates
SELECT
  COUNT(*) AS total_orders,
  COUNT(DISTINCT user_id) AS unique_customers,
  COUNT(DISTINCT product_id) AS unique_products,
  COUNT(DISTINCT DATE(created_at)) AS days_with_orders
FROM orders;

-- Conditional aggregation (pre-FILTER syntax)
SELECT
  product_id,
  SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS completed_count,
  SUM(CASE WHEN status = 'completed' THEN total ELSE 0 END) AS completed_revenue,
  AVG(CASE WHEN rating >= 4 THEN rating END) AS avg_good_rating
FROM orders
GROUP BY product_id;
2 files · sql Explain with highlit

Advanced aggregations extract insights from data. ROLLUP creates hierarchical subtotals. CUBE generates all possible grouping combinations. GROUPING SETS specifies exact grouping combinations. FILTER clause conditions aggregations. String aggregation concatenates values. JSON aggregation builds complex structures. Ordered set aggregates compute percentiles, mode. Hypothetical set aggregates answer what-if questions. Moving aggregates track trends. Array aggregation collects values. Understanding aggregate functions unlocks powerful analytics. Aggregate filters improve query clarity. Proper use of aggregations replaces complex application logic with efficient SQL. Aggregations are foundational for reporting, analytics, data warehousing.