Problema
Ai fini della rendicontazione, dobbiamo sapere quanti utenti si sono registrati, ma raggruppati in intervalli di date utili (bin).
Dobbiamo anche conoscere il numero totale di utenti negli stessi bin di date.
Soluzione
La query seguente funziona creando un’espressione di tabella comune (CTE) in cui la colonna user.created_at viene trasformata in una stringa ANNO-MESE e in un conteggio del numero di utenti in quel “bin” mensile.
Quindi viene utilizzata un’operazione di finestra (OVER) per generare una somma cumulativa 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
L’incantesimo OVER l’ho copiato da SO, quindi non ho idea se tutte quelle opzioni siano strettamente necessarie.
Sarebbe facile cambiare la dimensione dei bin di date modificando il formato di yeardate.