Este é um relatório de painel em SQL para Usuário para Usuário (com respostas) e Usuário para Usuário (excluindo respostas).
Este relatório conta o número de mensagens pessoais enviadas por usuários a cada dia, dentro de um intervalo de datas especificado, fornecendo insights sobre a atividade de engajamento do usuário na comunicação privada.
--[params]
-- date :start_date = 2024-01-06
-- date :end_date = 2024-02-07
-- boolean :include_replies = false
SELECT
p.created_at::date as day,
COUNT(p.user_id) as personal_messages
FROM posts p
INNER JOIN topics t ON (p.topic_id = t.id)
WHERE archetype = 'private_message'
AND p.user_id > 0
AND t.subtype = 'user_to_user'
AND p.deleted_at ISNULL
AND t.deleted_at ISNULL
AND p.created_at::date BETWEEN :start_date AND :end_date
AND (:include_replies = true OR p.post_number = 1)
GROUP BY p.created_at::date
ORDER BY p.created_at::date
Explicação da Consulta SQL
Esta consulta SQL executa as seguintes ações:
- Parâmetros:
:start_datee:end_date, que são usados para filtrar os dados dentro do intervalo de datas especificado. Ambos os parâmetros de data aceitam o formatoAAAA-MM-DD.:include_repliespara determinar se as respostas às mensagens iniciais devem ser incluídas na contagem. Definido comofalsepor padrão para espelhar o comportamento do relatório Usuário para Usuário (excluindo respostas). Definir este parâmetro comotrueespelhará o comportamento do relatório Usuário para Usuário (com respostas).
- Seleção de Dados:
- A consulta seleciona a data
created_atda tabelaposts, que representa a data em que cada mensagem foi criada.
- A consulta seleciona a data
- Operação de Junção:
- A consulta executa um INNER JOIN entre as tabelas
postsetopicsem seus camposid. Essa junção é crucial, pois vincula cada postagem ao seu tópico correspondente, permitindo-nos filtrar apenas as postagens que fazem parte de uma conversa de mensagem pessoal.
- A consulta executa um INNER JOIN entre as tabelas
- Critérios de Filtragem: A consulta aplica vários filtros:
- Ela considera apenas postagens que fazem parte de um tópico com um
archetypede ‘private_message’, garantindo que apenas mensagens pessoais sejam contadas. - Ela filtra quaisquer postagens que não estejam associadas a um usuário, garantindo que
user_idseja maior que 0. - Ela refina ainda mais os resultados para tópicos com um
subtypede ‘user_to_user’, que indica uma mensagem pessoal entre usuários individuais. - Ela exclui quaisquer postagens ou tópicos que foram excluídos, verificando se
deleted_até NULL para ambas as tabelas. - Ela aplica o filtro de intervalo de datas para incluir apenas postagens criadas entre
:start_datee:end_date. - Se
:include_repliesfor falso, apenas a primeira postagem em cada tópico é contada (p.post_number = 1), excluindo respostas.
- Ela considera apenas postagens que fazem parte de um tópico com um
- Agregação: A consulta agrupa os resultados pela data em que as postagens foram criadas, o que permite contar o número de mensagens enviadas em cada data.
- Ordenação: Finalmente, a consulta ordena os resultados por data em ordem crescente, fornecendo uma sequência cronológica da atividade de mensagens pessoais de usuário para usuário.
Resultados de Exemplo
| day | personal_messages |
|---|---|
| 2023-11-11 | 92 |
| 2023-11-12 | 57 |
| 2023-11-13 | 345 |
| 2023-11-14 | 124 |
| 2023-11-15 | 56 |