Eu acho que, na verdade, ele fornece números inflados devido às junções de grupo (além disso, todos fazem parte de um grupo automático para seu nível de confiança, então há um pouco de inconsistência aí). Acho que podemos remover isso e talvez adicionar alguns ajustes para focar em tópicos, posts e MPs.
Deixe-me tentar.
Talvez algo como isto:
-- [params]
-- string :interval = 7 days
SELECT
split_part(ue.email, '@', 2) AS email_domain, -- Extrai a parte do domínio do e-mail
COUNT(p.id) AS "Total Posts",
COUNT(p.id) FILTER (WHERE p.post_number = 1 AND t.archetype = 'regular') AS "Tópicos",
COUNT(p.id) FILTER (WHERE p.post_number > 1 AND t.archetype = 'regular') AS "Posts",
COUNT(p.id) FILTER (WHERE t.archetype = 'private_message') AS "Posts de Mensagem Pessoal"
FROM posts p
JOIN user_emails ue ON p.user_id = ue.user_id AND ue.primary = TRUE -- Garante que estamos usando o e-mail principal
JOIN topics t ON t.id = p.topic_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL :interval -- Filtra posts dos últimos x tempo com base no parâmetro
AND p.user_id > 0 -- Exclui usuários do sistema (sistema e bots)
AND p.deleted_at ISNULL
AND t.deleted_at ISNULL
AND p.post_type <> 3
GROUP BY email_domain
ORDER BY "Total Posts" DESC -- Ordena os resultados pela contagem de posts em ordem decrescente