Verificación de elegibilidad para insignia

Uno de nuestros usuarios reportó que sentía que debería tener una insignia específica. Revisé la página de administración de insignias y ejecuté la consulta Preview granted badges, pero no aparecen en la lista.

¿Es la mejor manera de verificar la elegibilidad potencial usar algo como Data Explorer para obtener más información de la base de datos?

En la propia página de insignias (a través de tu panel de administración) puedes ver una vista previa de los resultados de la consulta, lo cual creo que es lo que has hecho.

Ejecutar esa consulta en el Explorador de datos debería devolver los mismos resultados.

Si aún no logras resolverlo, envíanos un correo electrónico y te ayudaremos a investigar.

Recibimos bastantes preguntas sobre la insignia Aficionado (100 días consecutivos). Por lo general, el problema es que un usuario ha perdido un día o más debido a diferencias en los husos horarios entre su ubicación y la hora del servidor.

Siempre he estado un poco confundido por la consulta que se utiliza para otorgar la insignia. Creo que ahora la estoy entendiendo. Aquí hay una consulta de Data Explorer que utiliza una lógica similar. Devuelve los periodos de visitas consecutivas de un usuario. Devuelve la fecha de inicio, el conteo de días consecutivos y la fecha de finalización para cada periodo de visitas consecutivas. De forma predeterminada, devuelve todos los periodos con 10 o más visitas. Para encontrar qué días ha perdido un usuario, establece el parámetro min_days en 1.

Si el valor de period_end que se devuelve en la primera fila de los resultados es la fecha actual en la que estás ejecutando la consulta, el usuario todavía está en carrera para obtener la insignia.

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

WITH consecutive_visits AS (
  SELECT user_id,
       visited_at,
       -- El valor de s será el mismo para cada grupo de días consecutivos
       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

Perfecto, eso me ha dado la perspectiva que buscaba :slight_smile: