AdvancedCTEs & Recursive

CTE: calculate running percentile by date

The query

SQL
WITH daily_orders AS (
  SELECT
    order_date::DATE AS d,
    COUNT(*) AS order_count
  FROM orders GROUP BY order_date::DATE
),
ranked AS (
  SELECT
    d,
    order_count,
    ROUND(PERCENT_RANK() OVER (ORDER BY order_count) * 100, 1) AS percentile,
    ROUND(CUME_DIST() OVER (ORDER BY order_count) * 100, 1) AS cum_dist
  FROM daily_orders
)
SELECT d, order_count, percentile, cum_dist
FROM ranked
WHERE d >= CURRENT_DATE - 90
ORDER BY d;
Tested against PostgreSQL 16

Note

PERCENT_RANK: fraction below current row. CUME_DIST: fraction <= current row. Subtle but important difference.

Tables referenced