From db920673dc49616cb92cdb77d5073e1ae50382d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?= <regis@hanol.fr>
Date: Thu, 7 Sep 2017 01:08:28 +0200
Subject: [PATCH] FIX: consecutive_visits query wasn't return only the first
 result per user

---
 lib/badge_queries.rb | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/lib/badge_queries.rb b/lib/badge_queries.rb
index e249f228bc9..515e44cfa88 100644
--- a/lib/badge_queries.rb
+++ b/lib/badge_queries.rb
@@ -234,13 +234,18 @@ SQL
 
   def self.consecutive_visits(days)
     <<~SQL
-      SELECT user_id, "start" + interval '1' day * COUNT(*) AS "granted_at"
-        FROM (
-          SELECT user_id, visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int "start"
-            FROM user_visits
-        ) s
-        GROUP BY user_id, "start"
+      WITH consecutive_visits AS (
+        SELECT user_id, visited_at - (DENSE_RANK() OVER (PARTITION BY user_id ORDER BY visited_at))::int "start"
+          FROM user_visits
+      ), visits AS (
+        SELECT user_id, "start", DENSE_RANK() OVER (PARTITION BY user_id ORDER BY "start") "rank"
+          FROM consecutive_visits
+      GROUP BY user_id, "start"
         HAVING COUNT(*) >= #{days}
+      )
+      SELECT user_id, "start" + interval '#{days} days' "granted_at"
+        FROM visits
+       WHERE "rank" = 1
     SQL
   end