Consulta para crear algunos grupos basados en la actividad

En mi comunidad necesito segmentar a mi gente basándome en:

  • “likes” recibidos (30 - 100 - 200)
  • publicaciones leídas (1k 2k 5k)
  • mínimo de publicaciones durante el último año

¿Cómo puedo hacer esto usando el explorador de datos?
Me gustaría tener una consulta donde ponga esos parámetros y me liste a las personas, para poder añadirlas manualmente a un grupo. Muy fácil.
¿Alguna pista? ¿Por dónde puedo empezar?

2 Me gusta

Creo que algo como esto podría funcionar:

-- [params]
-- int :likes_received
-- int :posts_read

SELECT 
    us.user_id,
    us.likes_received,
    us.posts_read_count
FROM user_stats us
  JOIN users u on u.id = us.user_id
WHERE u.last_posted_at > CURRENT_DATE - INTERVAL '1 YEAR'
  AND us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
ORDER BY 2 DESC, 3 DESC

¡Esto es genial!
¿Cómo puedo encontrar si la publicación se realizó al menos 10 veces durante el último año?
No solo una vez como en tu consulta

¿Cómo puedo integrar esta consulta? Posts created for period

Solo para confirmar, ¿estás buscando “Me gusta” y “Publicaciones leídas” de todos los tiempos o esos recuentos también son del último año?

Estos parecen sospechosamente grupos de Nivel de Confianza existentes (y la población de estos se automatiza con medidas similares) - ¿por qué no modificas los umbrales existentes y lo tienes todo hecho?

/admin/site_settings/category/trust

por ejemplo, para TL2 (los miembros están en trust_level_2 o el equivalente en tu dialecto):

1 me gusta

El script de automatización ahora agregará personas a un grupo si obtienen una insignia. Si puedes usar SQL personalizado para las insignias, puedes automatizarlo, pero parece que se trata de niveles de confianza.

1 me gusta

Puedo ver las ventajas de crear grupos personalizados. Por ejemplo, solo el TL3 depende de la participación mínima a lo largo del tiempo. Por lo tanto, algo como esto también podría excluir a personas de cada grupo personalizado si su participación disminuye durante el año.

Además, no estarían vinculados a las habilidades predeterminadas y podrían aprovechar las funciones habilitadas para grupos o categorías premium específicas.

Sin embargo, no sé cuál es la configuración específica para estos, por lo que podría ser factible a través de los niveles de confianza.

1 me gusta

Todos los tiempos para me gusta y lecturas de publicaciones (la primera es para centrarse en buenas contribuciones, no solo en publicaciones, la segunda es para equilibrarlo)
El mínimo de publicaciones es solo dentro del último año, es un parámetro para entender si los miembros siguen activos de forma constante.

Podría ser una buena manera, pero en mi caso debería modificar mucho TL1, TL2 y TL3 y necesito tener en cuenta las limitaciones a continuación.

Lo siento, no lo entiendo, ¿debería usar una insignia?
Uhm, ¿cómo puedo modificar la consulta anterior para insertarla en una insignia?

1 me gusta

En ese caso, creo que algo como esto podría proporcionar la búsqueda manual:

-- [params]
-- int :likes_received
-- int :posts_read


WITH user_activity AS (

    SELECT 
        p.user_id, 
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT 
    us.user_id,
    us.likes_received,
    us.posts_read_count,
    ua.posts_count
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= 10
ORDER BY 2 DESC, 3 DESC, 4 DESC

Y modificándolo/simplificándolo solo a nombres de usuario proporcionaría una lista que podrías copiar y pegar en el cuadro ‘Añadir Usuarios’ en la página de grupos si exportaras los resultados como un csv (y lo abrieras en algo como el bloc de notas, por ejemplo):

-- [params]
-- int :likes_received
-- int :posts_read


WITH user_activity AS (

    SELECT 
        p.user_id, 
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT 
    u.username
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
  JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= 10
ORDER BY 1

Esto también es posible. :partying_face: Necesitarías una insignia (y una consulta de insignia) para cada grupo, y una automatización acompañante usando el script ‘User Group Membership through Badge’. También podrías automatizar las insignias en lugar de concederlas manualmente habilitando las Insignias Personalizadas Activadas (Enable Badge SQL y Creating triggered custom badge queries)

Sin embargo, hay muchas partes móviles, por lo que es posible que desees mantenerlo simple en esta etapa.

2 Me gusta

¡Eso es increíble! Muchas gracias, Jammy.

1 me gusta

No te preocupes. :slight_smile: Espero que con el primero puedas comprobar que obtienes los resultados que esperas, y el segundo debería facilitar la adición a un grupo. :+1:

Avísame si hay que ajustar algo. :slight_smile:

Los fusioné y mejoré (con mis pobres habilidades de SQL), si necesito nombres de usuario, simplemente descargo el CSV y copio/pego la columna de nombres de usuario.
Agregué likes_received_max para poder dividir grupos, excluyendo el grupo anterior.

Por ejemplo:
first_steps: 5 me gusta (<30), 500 publicaciones leídas, >5 publicaciones el año pasado,
beginners: 30 me gusta (<100), 1000 publicaciones leídas, >10 publicaciones el año pasado
padawan: 100 me gusta, 2000 publicaciones leídas, >10 publicaciones el año pasado
hero: 200 me gusta, 5000 publicaciones leídas, >10 publicaciones el año pasado

-- [params]
-- int :likes_received
-- int :posts_read
-- int :likes_received_max
-- int :posts_count


WITH user_activity AS (
    SELECT
        p.user_id,
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT
    us.user_id,
    u.username,
    us.likes_received,
    us.posts_read_count,
    ua.posts_count,
    u.title
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
  JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= :posts_count
  AND us.likes_received < :likes_received_max
ORDER BY 2 ASC, 3 ASC, 4 ASC

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.