Проблема
Для отчётности нам нужно знать, сколько пользователей зарегистрировалось, но сгруппированных по полезным интервалам дат (бины).
Нам также нужно знать общее количество пользователей в тех же временных бинах.
Решение
Ниже приведён запрос, который работает путём создания общего табличного выражения (CTE), где столбец user.created_at преобразуется в строку формата ГОД-МЕСЯЦ и подсчитывается количество пользователей в этом месячном “бине”.
Затем используется оконная операция (OVER) для вычисления накопительной суммы по count:
WITH data as (
SELECT
TO_CHAR(u.created_at,'yyyy-MM') AS yeardate,
COUNT(*)
FROM users u
GROUP BY yeardate
ORDER BY yeardate
)
SELECT
yeardate,
count,
SUM(count::int) OVER (
order by yeardate asc rows between unbounded preceding and current row
) AS cumulative
FROM data
Я скопировал конструкцию OVER с Stack Overflow, поэтому не уверен, что все эти опции строго необходимы.
Легко изменить размер временных бинов, изменив форматирование yeardate.