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