Excluir grupos de la consulta de Miembros de Alta Calidad

Hola,

¿Alguna recomendación sobre cómo puedo eliminar ciertos grupos de esta consulta?

SELECT 
    sum(p.score) / count(p) as "promedio de puntuación por publicación", 
    count(p.id) as post_count, 
    p.user_id
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
  AND u.active
GROUP by user_id, u.views
HAVING count(p.id) > 40
ORDER BY sum(p.score) / count(p) DESC
LIMIT 100

¡Gracias de antemano!

No lo probé realmente.

-- [parámetros]
-- int_list :exclude_groups = 12, 2, 3

SELECT 
    sum(p.score) / count(p) as "puntuación promedio por publicación", 
    count(p.id) as conteo_publicaciones, 
    p.user_id
FROM posts p
JOIN users u ON u.id = p.user_id
LEFT JOIN group_users gu on u.id = gu.user_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
  AND u.active
  AND (gu.group_id not IN (:exclude_groups))
GROUP by p.user_id, u.views
HAVING count(p.id) > 40
ORDER BY sum(p.score) / count(p) DESC
LIMIT 100

Gracias, @pfaffman. Eso es muy amable de tu parte.

Ejecuté el script y veo que aparecen en los resultados miembros de los grupos excluidos. Por supuesto, son miembros de muchos grupos. ¿Existe alguna forma de que este script excluya absolutamente a todos los miembros de todos los grupos en la lista :exclude_groups?

Gracias por tu atención.

Oh. Claro. El not in no funcionó como pensé al principio. Básicamente no hace nada. Creo que lo que hay que hacer es primero una consulta que obtenga los usuarios que no están en ningún grupo y luego unir eso con la otra parte de la consulta.

Lo siento.


    -- [parámetros]
    -- int_list :exclude_groups = 1,2

    SELECT 
        sum(p.score) / count(p) as "puntuación promedio por publicación", 
        count(p.id) as conteo_publicaciones, 
        p.user_id
    FROM posts p
    JOIN users u ON u.id = p.user_id
    WHERE p.created_at >= CURRENT_DATE - INTERVAL '3 month'
      AND u.active
      AND u.id NOT IN(
        SELECT user_id FROM group_users WHERE group_id IN (:exclude_groups)
      )
    GROUP BY user_id, u.views
    HAVING count(p.id) > 40
    ORDER BY sum(p.score) / count(p) DESC
    LIMIT 100

@RGJ,

Agradecemos mucho tus contribuciones al ecosistema de Discourse y tu increíble apoyo como cliente. ¡Me emociona que ofrezcas un servicio de alojamiento tan extraordinario!