Inscripciones de nuevos usuarios por mes con total acumulado

Problema

Para fines de informes, necesitamos saber cuántos usuarios se han registrado, pero agrupados en intervalos de rangos de fechas útiles (bins).

También necesitamos saber el número total de usuarios en los mismos bins de fechas.

Solución

La siguiente consulta funciona creando una expresión de tabla común (CTE) donde la columna user.created_at se transforma en una cadena AÑO-MES y un recuento del número de usuarios en ese “bin” mensual.

Luego, se utiliza una operación de ventana (OVER) para generar una suma acumulativa del 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

La incantación OVER la copié de SO, así que no tengo idea si todas esas opciones son estrictamente necesarias.

Sería fácil cambiar el tamaño de los bins de fechas cambiando el formato de yeardate.

Tenemos algunos similares en este tema si quieres probarlos y ver cómo se comparan:

1 me gusta

¡Oh, qué bien! Gracias.

Pensé que había buscado, claramente no lo suficiente o con una salsa secreta insuficiente.

Eso me habría ahorrado algo de tiempo… suspiro

2 Me gusta