IntermediateGROUP BY & Aggregation

Top 3 products by revenue in each category

The query

SQL
SELECT *
FROM (
  SELECT
    cat.name AS category,
    p.name AS product,
    SUM(oi.qty * oi.unit_price) AS revenue,
    RANK() OVER (PARTITION BY cat.cat_id ORDER BY SUM(oi.qty * oi.unit_price) DESC) AS rnk
  FROM categories cat
  JOIN products p ON cat.cat_id = p.cat_id
  JOIN order_items oi ON p.product_id = oi.product_id
  GROUP BY cat.cat_id, cat.name, p.product_id, p.name
) t
WHERE rnk <= 3
ORDER BY category, rnk;
Tested against PostgreSQL 16

Note

Classic top-N per group pattern. RANK in subquery, filter in outer query.

Tables referenced