Nuove registrazioni utenti per mese con totale progressivo

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.

Abbiamo alcuni argomenti simili in questo topic se desideri provarli e vedere come si confrontano:

1 Mi Piace

Oh bello! Grazie.

Pensavo di aver cercato, chiaramente non abbastanza bene o con salsa segreta insufficiente.

Questo mi avrebbe fatto risparmiare un po’ di tempo… sospiro

2 Mi Piace