バッジの適格性を確認

「Aficionado(100 日連続)」バッジに関する質問を数多くいただいています。問題の多くは、ユーザーのロケールとサーバーの時刻との時差により、1 日以上欠けてしまうことにあります。

バッジ付与に使用されるクエリについては、以前から少し混乱していました。今は理解できたと思います。以下は、同様のロジックを使用した Data Explorer クエリです。これはユーザーの連続訪問期間を返します。各連続訪問期間について、開始日、連続日数、終了日を返します。デフォルトでは 10 回以上の訪問があるすべての期間が返されます。ユーザーがどの日を欠いたかを確認するには、min_days パラメータを 1 に設定してください。

結果の最初の行で返される period_end の値が、クエリを実行した当日の日付である場合、そのユーザーはまだバッジの資格を維持しています。

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

WITH consecutive_visits AS (
  SELECT user_id,
       visited_at,
       -- s の値は連続した日数の各グループで同じになります
       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