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?
-- [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
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):
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.
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.
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?
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. 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.
No te preocupes. 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.
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