Questo è un report di dashboard in versione SQL per i nuovi collaboratori.
Questo report di dashboard SQL è progettato per fornire agli amministratori una chiara visione d’insieme dell’interazione degli utenti sul loro forum Discourse identificando quanti utenti hanno effettuato il loro primo post ogni giorno all’interno di un intervallo di date specificato.
-- [params]
-- date :start_date = 2023-12-15
-- date :end_date = 2024-01-16
SELECT
date_trunc('day', p.created_at)::date AS day,
COUNT(DISTINCT p.user_id) AS new_contributors
FROM
posts p
INNER JOIN (
SELECT
user_id,
MIN(created_at) as first_post_date
FROM
posts
WHERE deleted_at IS NULL
GROUP BY
user_id
) fp ON p.user_id = fp.user_id
WHERE
p.created_at = fp.first_post_date
AND p.created_at BETWEEN :start_date AND (:end_date::date + 1)
GROUP BY
day
ORDER BY
day
Spiegazione della query SQL
Il report recupera il conteggio degli utenti distinti che hanno effettuato il loro primo post ogni giorno nell’intervallo di date specificato. Lo fa eseguendo i seguenti passaggi:
Parametri:
- La query accetta due parametri,
:start_datee:end_date, che definiscono l’intervallo di date per il report. Entrambi i parametri di data accettano il formato dataAAAA-MM-GG.
Query interna: Determinazione della data del primo post per ciascun utente
Questo report contiene una sottoquery che seleziona due colonne dalla tabella posts: user_id e il timestamp created_at più vecchio (alias first_post_date). Il timestamp created_at più vecchio rappresenta il primo post dell’utente. Questa sottoquery include una condizione WHERE che considera solo i post che non sono stati eliminati (deleted_at IS NULL). Infine, raggruppa i risultati per user_id per garantire che stiamo considerando solo il primo post per ciascun utente.
Query principale: Conteggio degli utenti che hanno effettuato il loro primo post
La query principale esegue le seguenti operazioni:
- JOIN: La tabella
postsprincipale (aliasp) viene unita al risultato della sottoquery (aliasfp) suuser_idper associare ogni post al primo post dell’utente corrispondente. - Filtraggio per data: La clausola
WHEREinclude due condizioni: confronta il timestampcreated_atdi ogni post confirst_post_datedella sottoquery per garantire che stiamo trattando solo i primi post, e verifica che il timestampcreated_atrientri nell’intervallo di date specificato, inclusa laend_date(+1 giorno per includere completamente il giorno finale). - Aggregazione: I post vengono quindi raggruppati per data, troncati al giorno senza componente oraria (
date_trunc('day', p.created_at)::date), il che consente di contare gli utenti unici che hanno pubblicato per la prima volta ogni giorno. - Conteggio: Utilizzando
COUNT(DISTINCT p.user_id), otteniamo il numero di utenti unici che hanno effettuato il loro primo post ogni giorno. - Ordinamento: I risultati vengono ordinati per giorno in ordine crescente (
ORDER BY day) per fornire una panoramica cronologica dell’interazione degli utenti.
Output finale
Il report finale è composto da due colonne:
day: La data di interazione dell’utente senza la componente oraria.new_contributors: Il numero di utenti distinti che hanno effettuato il loro primo post sul forum per ogni giorno.
Risultati di esempio
| day | new_contributors |
|---|---|
| 2023-12-15 | 16 |
| 2023-12-16 | 8 |
| 2023-12-17 | 7 |
| 2023-12-18 | 19 |
| 2023-12-19 | 15 |