À titre indicatif, vous pouvez trouver les requêtes existantes en utilisant l’Explorateur de données.
Par exemple : SELECT * from badges WHERE query LIKE '%10 jours%'
Voici celle pour 365 jours :
WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 365 ) SELECT user_id , "start" + interval '365 jours' "granted_at" FROM visits WHERE "rank" = 1
et pour 10 jours :
WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 10 ) SELECT user_id , "start" + interval '10 jours' "granted_at" FROM visits WHERE "rank" = 1
Donc, je suppose que ceci pourrait faire l’affaire pour 30 :
WITH consecutive_visits AS ( SELECT user_id , visited_at , visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int s FROM user_visits ), visits AS ( SELECT user_id , MIN(visited_at) "start" , DENSE_RANK() OVER (PARTITION BY user_id ORDER BY s) "rank" FROM consecutive_visits GROUP BY user_id, s HAVING COUNT(*) >= 30 ) SELECT user_id , "start" + interval '30 jours' "granted_at" FROM visits WHERE "rank" = 1
… ce que j’ai vérifié et qui semble retourner des résultats apparemment cohérents, mais je n’ai pas vérifié les résultats en détail 