Problema
Para fins de relatórios, precisamos saber quantos usuários se inscreveram, mas agrupados em intervalos úteis de data (bins).
Também precisamos saber o número total de usuários nos mesmos bins de data.
Solução
A consulta a seguir funciona criando uma expressão de tabela comum (CTE) onde a coluna user.created_at é transformada em uma string ANO-MÊS e uma contagem do número de usuários nesse “bin” mensal.
Em seguida, uma operação de janela (OVER) é usada para gerar uma soma cumulativa da 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
A incantação OVER foi copiada do SO, então não tenho ideia se todas essas opções são estritamente necessárias.
Seria fácil alterar o tamanho dos bins de data alterando a formatação de yeardate.