WITH a AS
(SELECT CAST(DATE_TRUNC('month', order_date) AS DATE) AS MONTH
,COUNT(DISTINCT customer_id) AS customers_this_month
FROM northwind.orders
WHERE CAST(DATE_TRUNC('month', order_date) AS DATE) BETWEEN '1996-07-01' AND '1998-05-31'
GROUP BY CAST(DATE_TRUNC('month', order_date) AS DATE)),
b AS
(SELECT customer_id, MIN(CAST(DATE_TRUNC('month', order_date) AS DATE)) AS MONTH
FROM northwind.orders
GROUP BY customer_id
ORDER BY 2),
c AS
(SELECT MONTH, SUM(COUNT(customer_id)) OVER (ORDER BY MONTH) AS total_customers
FROM b
GROUP BY MONTH)
SELECT a.month, a.customers_this_month, c.total_customers, ROUND(a.customers_this_month*1.0/c.total_customers*100,2)
FROM a
LEFT JOIN C ON a.month=c.month
ORDER BY a.month