Query per creare alcuni gruppi in base all'attività

Nella mia community devo segmentare le mie persone in base a:

  • Mi piace ricevuti (30 - 100 - 200)
  • Post letti 1k 2k 5k
  • Minimo di post nell’ultimo anno

Come posso farlo usando il data explorer?
Vorrei avere una query in cui inserisco quei parametri e mi elenca le persone, così posso aggiungerle manualmente a un gruppo. Molto facile
Qualche suggerimento? Da dove posso iniziare?

2 Mi Piace

Penso che qualcosa del genere potrebbe funzionare:

-- [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

Questo è fantastico!
Come posso trovare se il post è stato pubblicato almeno 10 volte nell’ultimo anno?
Non solo una volta come nella tua query

Come posso integrare questa query? Posts created for period

Solo per verificare, stai cercando Mi piace e Post letti di tutti i tempi o anche questi conteggi sono relativi all’ultimo anno?

Questi sembrano sospettosamente simili ai gruppi di Livello di Fiducia esistenti (e la popolazione di questi è automatizzata da misure simili) - perché non modificare semplicemente le soglie esistenti e far fare tutto a te?

/admin/site_settings/category/trust

ad esempio per TL2 (i membri sono in trust_level_2 o equivalente nel tuo dialetto):

1 Mi Piace

Lo script di automazione aggiungerà ora le persone a un gruppo se ottengono un badge. Se puoi usare SQL personalizzato per i badge, puoi automatizzarlo, ma sembra che si tratti di livelli di fiducia.

1 Mi Piace

Posso vedere i vantaggi nel creare gruppi personalizzati. Ad esempio, solo il TL3 si basa sul coinvolgimento minimo nel tempo. Quindi qualcosa di simile potrebbe anche escludere le persone da ciascun gruppo personalizzato se il loro coinvolgimento diminuisce nel corso dell’anno.

Inoltre, non sarebbero legati alle funzionalità standard e potrebbero sfruttare funzionalità abilitate per i gruppi o categorie premium specifiche.

Tuttavia, non so quale sia la configurazione specifica per questi, quindi potrebbe essere realizzabile attraverso i livelli di fiducia.

1 Mi Piace

Tutti i tempi per mi piace e post letti (il primo serve a concentrarsi sui buoni contributi, non solo sui post, il secondo serve a bilanciarlo)
Il minimo di post è solo nell’ultimo anno, è un parametro per capire se i membri sono ancora attivi in modo costante.

Potrebbe essere un buon modo, ma nel mio caso dovrei modificare pesantemente TL1 TL2 e TL3 e devo tenere conto delle limitazioni sottostanti

Mi dispiace, non riesco a capirlo, dovrei usare un badge?
Uhm, come posso modificare la query sopra per inserirla in un badge?

1 Mi Piace

In tal caso, penso che qualcosa di simile potrebbe fornire la ricerca manuale:

-- [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

E modificandolo/semplificandolo solo per i nomi utente fornirebbe un elenco che potresti copiare e incollare nella casella “Aggiungi Utenti” nella pagina dei gruppi se esportassi i risultati come csv (e lo aprissi in qualcosa come notepad, per esempio):

-- [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

Anche questo è possibile. :partying_face: Avresti bisogno di un badge (e una query per badge) per ogni gruppo, e un’accompagnatoria automazione utilizzando lo script “User Group Membership through Badge”. Potresti anche automatizzare i badge piuttosto che assegnarli manualmente abilitando i Badge Personalizzati Attivati (Enable Badge SQL e Creating triggered custom badge queries)

Ci sono molte parti in movimento, quindi potresti voler mantenere le cose semplici in questa fase.

2 Mi Piace

È fantastico! Grazie mille Jammy

1 Mi Piace

Nessun problema. :slight_smile: Spero che con il primo tu possa verificare di ottenere i risultati che ti aspetti, e il secondo dovrebbe rendere più facile aggiungerli a un gruppo. :+1:

Fammi sapere se qualcosa necessita di modifiche. :slight_smile:

Li ho uniti e migliorati (con le mie scarse abilità SQL), se ho bisogno di nomi utente scarico il CSV e copio/incollo la colonna dei nomi utente.
Ho aggiunto likes_received_max in modo da poter dividere i gruppi, escludendo il gruppo sopra.

Ad esempio:
first_steps: 5 like (<30), 500 post letti, >5 post l’anno scorso,
beginners: 30 like (<100), 1000 post letti, >10 post l’anno scorso
padawan: 100 like, 2000 post letti, >10 post l’anno scorso
hero: 200 like, 5000 post letti, >10 post l’anno scorso

-- [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.