Creo que en realidad da números inflados debido a las uniones de grupos (además, todos forman parte de un grupo automático por su nivel de confianza, por lo que hay una pequeña inconsistencia allí). Creo que podemos eliminar eso y tal vez hacer un par de ajustes para centrarnos en temas, publicaciones y mensajes privados.
Déjame intentarlo.
Quizás algo como esto:
-- [params]
-- string :interval = 7 days
SELECT
split_part(ue.email, '@', 2) AS email_domain, -- Extrae la parte del dominio del correo electrónico
COUNT(p.id) AS "Total Posts",
COUNT(p.id) FILTER (WHERE p.post_number = 1 AND t.archetype = 'regular') AS "Topics",
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 "Personal Message posts"
FROM posts p
JOIN user_emails ue ON p.user_id = ue.user_id AND ue.primary = TRUE -- Asegura que estamos usando el correo electrónico principal
JOIN topics t ON t.id = p.topic_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL :interval -- Filtra las publicaciones de los últimos x tiempo según el parámetro
AND p.user_id > 0 -- Excluye usuarios del sistema (sistema y 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 los resultados por el recuento de publicaciones en orden descendente