Consulta para contar publicaciones por dominio de correo electrónico en los últimos 7 días, excluyendo grupos automáticos (bots, sistema)
SELECT
split_part(ue.email, '@', 2) AS email_domain, -- Extrae la parte del dominio del correo electrónico
COUNT(p.id) AS post_count
FROM
posts p
JOIN users u ON p.user_id = u.id
JOIN user_emails ue ON u.id = ue.user_id
AND ue.primary = TRUE -- Asegura que estamos usando el correo electrónico principal
LEFT JOIN group_users gu ON gu.user_id = u.id
LEFT JOIN GROUPS g ON gu.group_id = g.id
AND g.automatic = TRUE
WHERE
p.created_at >= CURRENT_DATE - INTERVAL '7 days' -- Filtra las publicaciones de los últimos 7 días
AND g.id IS NULL -- Asegura que los usuarios no formen parte de ningún grupo automático
GROUP BY
email_domain
ORDER BY
post_count DESC -- Ordena los resultados por el recuento de publicaciones en orden descendente
Esto no parece correcto. ¿Cuál es la intención?
¿Contar las publicaciones de la última semana, agrupadas por dominio de correo electrónico, pero excluyendo a los usuarios del sistema?
¿Necesita contar las publicaciones eliminadas o las publicaciones de temas eliminados, excluir las publicaciones de acciones pequeñas o las que se encuentran en mensajes privados?
Esta fue una prueba rápida y sucia del bot SQL Helper para encontrar el recuento de publicaciones por dominio. El caso de uso podría ser para asociaciones o foros de membresía que desean rastrear qué subgrupos dentro del foro están más comprometidos.
Ciertamente podría refinarse, como eliminar publicaciones eliminadas o de acciones pequeñas, PM, etc., pero pensé en publicarlo en caso de que alguien pudiera inspirarse en él.
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