Новые регистрации пользователей по месяцам с накопительным итогом

Проблема

Для отчётности нам нужно знать, сколько пользователей зарегистрировалось, но сгруппированных по полезным интервалам дат (бины).

Нам также нужно знать общее количество пользователей в тех же временных бинах.

Решение

Ниже приведён запрос, который работает путём создания общего табличного выражения (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.

В этой теме есть несколько похожих вариантов, если вы захотите их протестировать и сравнить:

О, здорово! Спасибо.

Думал, что уже искал, но явно недостаточно хорошо или без нужных секретных ингредиентов.

Это сэкономило бы мне время… вздох