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.