Requête pour créer des groupes basés sur l'activité

Dans ma communauté, je dois segmenter mes membres en fonction de :

  • J’aime reçus (30 - 100 - 200)
  • Articles lus (1k - 2k - 5k)
  • Minimum d’articles au cours de la dernière année

Comment puis-je faire cela en utilisant l’explorateur de données ?
J’aimerais avoir une requête où je mets ces paramètres et elle liste les personnes, afin que je puisse les ajouter manuellement à un groupe. Très facile.
Quelques indices ? Par où commencer ?

2 « J'aime »

Je pense que quelque chose comme ceci pourrait le faire :

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

C’est super !
Comment puis-je trouver si le message a été posté au moins 10 fois au cours de la dernière année ?
Pas seulement une fois comme dans votre requête.

Comment puis-je intégrer cette requête ? Posts created for period

Juste pour vérifier, recherchez-vous les J’aime et les Articles lus de tous les temps ou ces décomptes sont-ils également pour l’année écoulée ?

Cela ressemble étrangement aux groupes de niveaux de confiance existants (et la population de ceux-ci est automatisée par des mesures similaires) - pourquoi ne pas simplement modifier les seuils existants et tout faire faire pour vous ?

/admin/site_settings/category/trust

par exemple pour le TL2 (les membres sont dans trust_level_2 ou l’équivalent dans votre dialecte) :

1 « J'aime »

Le script d’automatisation ajoutera désormais des personnes à un groupe si elles obtiennent un badge. Si vous pouvez utiliser SQL personnalisé pour les badges, vous pouvez l’automatiser, mais cela ressemble à des niveaux de confiance.

1 « J'aime »

Je vois les avantages de créer des groupes personnalisés. Par exemple, seul le niveau TL3 dépend d’un engagement minimum sur la durée. Donc, quelque chose comme ça pourrait également exclure des personnes de chaque groupe personnalisé si leur engagement diminue au cours de l’année.

Ils ne seraient pas non plus liés aux capacités standard et pourraient profiter des fonctionnalités activées pour les groupes ou de catégories premium spécifiques.

Cependant, je ne connais pas la configuration spécifique de ces groupes, il est donc possible que cela soit réalisable via les niveaux de confiance.

1 « J'aime »

Tous les temps pour les likes et les posts lus (le premier vise à se concentrer sur les bonnes contributions, pas seulement sur les posts, le second sert à équilibrer)
Le minimum de posts ne concerne que l’année écoulée, c’est un paramètre pour comprendre si les membres sont toujours activement présents.

Cela pourrait être une bonne approche, mais dans mon cas, je devrais modifier considérablement les niveaux de confiance TL1, TL2 et TL3 et tenir compte des limitations ci-dessous.

Désolé, je ne comprends pas, dois-je utiliser un badge ?
Euh, comment puis-je modifier la requête ci-dessus pour l’insérer dans un badge ?

1 « J'aime »

Dans ce cas, je pense que quelque chose comme ceci pourrait fournir la recherche manuelle :

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

Et en le modifiant/simplifiant pour obtenir uniquement les noms d’utilisateur, cela fournirait une liste que vous pourriez copier-coller dans la boîte “Ajouter des utilisateurs” sur la page du ou des groupes si vous exportiez les résultats en csv (et l’ouvriez dans un programme comme notepad, par exemple) :

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

C’est aussi possible. :partying_face: Vous auriez besoin d’un badge (et d’une requête de badge) pour chaque groupe, et d’une automatisation associée utilisant le script “User Group Membership through Badge”. Vous pourriez également automatiser les badges plutôt que de les attribuer manuellement en activant les Badges Déclenchés Personnalisés (Enable Badge SQL et Creating triggered custom badge queries)

Il y a beaucoup d’éléments en jeu, donc vous voudrez peut-être rester simple à ce stade.

2 « J'aime »

C’est incroyable ! Merci beaucoup Jammy

1 « J'aime »

Pas de soucis. :slight_smile: J’espère qu’avec le premier, vous pourrez vérifier que vous obtenez les résultats attendus, et le second devrait faciliter leur ajout à un groupe. :+1:

Faites-moi savoir si quelque chose doit être ajusté. :slight_smile:

Je les ai fusionnés et améliorés (avec mes piètres compétences en SQL), si j’ai besoin de noms d’utilisateur, je télécharge simplement le CSV et je copie/colle la colonne nom d’utilisateur.
J’ai ajouté likes_received_max pour pouvoir diviser les groupes, en excluant le groupe ci-dessus.

Par exemple :
premiers_pas : 5 likes (<30), 500 posts lus, >5 posts l’année dernière,
débutants : 30 likes (<100), 1000 posts lus, >10 posts l’année dernière
padawan : 100 likes, 2000 posts lus, >10 posts l’année dernière
héros : 200 likes, 5000 posts lus, >10 posts l’année dernière

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