Este é um relatório de painel em SQL para novos contribuidores.
Este relatório de painel SQL foi projetado para fornecer aos administradores uma visão clara do engajamento do usuário em seu fórum Discourse, identificando quantos usuários fizeram sua primeira postagem em cada dia dentro de um intervalo de datas especificado.
-- [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
Explicação da Consulta SQL
O relatório busca a contagem de usuários distintos que fizeram sua primeira postagem em cada dia dentro do intervalo de datas especificado. Ele faz isso realizando as seguintes etapas:
Parâmetros:
- A consulta aceita dois parâmetros,
:start_datee:end_date, que definem o intervalo de datas para o relatório. Ambos os parâmetros de data aceitam o formato de dataAAAA-MM-DD.
Subconsulta: Determinando a Data da Primeira Postagem para Cada Usuário
Este relatório contém uma subconsulta que seleciona duas colunas da tabela posts: user_id e o timestamp created_at mais antigo (apelidado de first_post_date). O timestamp created_at mais antigo representa a primeira postagem do usuário. Esta subconsulta inclui uma condição WHERE que considera apenas as postagens que não foram excluídas (deleted_at IS NULL). Finalmente, ele agrupa os resultados por user_id para garantir que estamos olhando apenas para a primeira postagem de cada usuário.
Consulta Principal: Contagem de Usuários que Fizeram Sua Primeira Postagem
A consulta principal realiza as seguintes operações:
- JOIN: A tabela principal
posts(apelidada dep) é unida ao resultado da subconsulta (apelidado defp) emuser_idpara corresponder cada postagem com a primeira postagem do usuário correspondente. - Filtragem por Data: A cláusula
WHEREinclui duas condições - ela compara o timestampcreated_atde cada postagem com ofirst_post_dateda subconsulta para garantir que estamos lidando apenas com as primeiras postagens, e verifica se o timestampcreated_atestá dentro do intervalo de datas especificado, incluindo oend_date(+1 dia para incluir o dia final completamente). - Agregação: As postagens são então agrupadas pela data, truncadas para o dia sem componente de tempo (
date_trunc('day', p.created_at)::date), o que permite contar os usuários únicos que postaram pela primeira vez em cada dia. - Contagem: Usando
COUNT(DISTINCT p.user_id), obtemos o número de usuários únicos que fizeram sua primeira postagem em cada dia respectivo. - Ordenação: Os resultados são ordenados por dia em ordem crescente (
ORDER BY day) para fornecer uma visão cronológica do engajamento do usuário.
Saída Final
O relatório final consiste em duas colunas:
day: A data de engajamento do usuário sem o componente de tempo.new_contributors: O número de usuários distintos que fizeram sua primeira postagem no fórum para cada dia.
Resultados de Exemplo
| day | new_contributors |
|---|---|
| 2023-12-15 | 16 |
| 2023-12-16 | 8 |
| 2023-12-17 | 7 |
| 2023-12-18 | 19 |
| 2023-12-19 | 15 |