# Verifica dell'idoneità al badge

**URL:** <https://meta.discourse.org/t/checking-badge-eligibility/154952>\
**Category:** Data & reporting\
**Tags:** sql-query\
**Created:** [16 Giugno 2020, 12:56am UTC](https://meta.discourse.org/t/checking-badge-eligibility/154952 "2020-06-16T00:56:23Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)\
**Post date:** [16 Giugno 2020, 2:37am UTC](https://meta.discourse.org/t/checking-badge-eligibility/154952/3 "2020-06-16T02:37:35Z")

</div>

> [@Mark\_Walkom](#):
>
> Uno dei nostri utenti ha [segnalato](https://discuss.elastic.co/t/i-think-i-completed-100-days-of-continous-forum-check/236980) di ritenere di meritare un badge specifico.

> [@Mark\_Walkom](#):
>
> È il modo migliore per verificare l’idoneità potenziale utilizzare qualcosa come [Data Explorer](https://meta.discourse.org/t/32566?silent=true) per ottenere più informazioni dal database?

Riceviamo diverse domande sul badge Aficionado (100 giorni consecutivi). Di solito il problema è che un utente ha saltato uno o più giorni a causa delle differenze di fuso orario tra la sua località e l’orario del server.

Sono sempre stato un po’ confuso dalla query utilizzata per assegnare il badge. Credo di averla capita ora. Ecco una query [Data Explorer](https://meta.discourse.org/t/32566?silent=true) che utilizza una logica simile. Restituisce i periodi di visite consecutive per un utente. Restituisce la data di inizio, il numero di giorni consecutivi e la data di fine per ogni periodo di visite consecutive. Per impostazione predefinita, restituisce tutti i periodi con 10 o più visite. Per scoprire quali giorni un utente ha saltato, imposta il parametro `min_days` a 1.

Se il valore `period_end` restituito nella prima riga dei risultati corrisponde alla data corrente in cui stai eseguendo la query, l’utente è ancora in corsa per il badge.

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

WITH consecutive_visits AS (
  SELECT user_id,
       visited_at,
       -- Il valore di s sarà lo stesso per ogni gruppo di giorni consecutivi
       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

```

---

_[View the full topic](https://meta.discourse.org/t/checking-badge-eligibility/154952)._
