Novos cadastros de usuários por mês com total acumulado

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.

Temos alguns semelhantes neste tópico se você quiser testá-los e ver como eles se comparam:

1 curtida

Ah, legal! Obrigado.

Pensei que tinha pesquisado, claramente não o suficiente ou com molho secreto insuficiente.

Isso teria me poupado algum tempo… suspiro

2 curtidas