Vérification de l'éligibilité au badge

L’un de nos utilisateurs a signalé qu’il estimait mériter un badge spécifique. J’ai consulté la page d’administration des badges et exécuté la requête « Aperçu des badges accordés », mais il n’apparaît pas dans la liste.

La meilleure façon de vérifier l’éligibilité potentielle est-elle d’utiliser un outil comme Data Explorer pour obtenir plus d’informations depuis la base de données ?

Sur la page du badge elle-même (via votre tableau de bord d’administration), vous pouvez prévisualiser les résultats de la requête, ce qui correspond, je pense, à ce que vous avez déjà fait.

Exécuter cette requête via l’Explorateur de données devrait renvoyer les mêmes résultats.

Si vous êtes toujours bloqué, envoyez-nous un e-mail et nous vous aiderons à creuser.

Nous recevons pas mal de questions concernant le badge « Aficionado » (100 jours consécutifs). Le problème vient généralement du fait qu’un utilisateur a manqué un jour ou plus en raison des différences de fuseaux horaires entre son paramètre local et l’heure du serveur.

J’ai toujours été un peu confus par la requête utilisée pour attribuer ce badge. Je pense maintenant la comprendre. Voici une requête Data Explorer qui utilise une logique similaire. Elle renvoie les périodes de visites consécutives pour un utilisateur. Elle retourne la date de début, le nombre de jours consécutifs et la date de fin pour chaque période de visites consécutives. Par défaut, elle renvoie toutes les périodes comportant 10 visites ou plus. Pour savoir quels jours un utilisateur a manqués, définissez le paramètre min_days à 1.

Si la valeur period_end renvoyée dans la première ligne des résultats correspond à la date actuelle à laquelle vous exécutez la requête, l’utilisateur est toujours en lice pour le badge.

--[params]
-- string :username
-- int :min_days = 10

WITH consecutive_visits AS (
  SELECT user_id,
       visited_at,
       -- La valeur de s sera identique pour chaque groupe de jours consécutifs
       visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s
    FROM user_visits
    WHERE user_id = (SELECT id FROM users WHERE username = :username)
)

SELECT
MIN(visited_at) period_start,
COUNT(*) AS consecutive_days,
MAX(visited_at) period_end
FROM consecutive_visits
GROUP BY user_id, s
HAVING COUNT(*) >= :min_days
ORDER BY period_start DESC

Parfait, cela m’a donné les éclaircissements que je recherchais :slight_smile: