检查徽章资格

我们的一位用户指出,他们认为应该获得某个特定的徽章。我在徽章管理页面查看了一下,并运行了“预览已授予徽章”查询,但他们并不在列表中。

检查潜在资格的最佳方式是否是使用类似数据探索器(Data Explorer)的工具从数据库获取更多信息?

在实际的徽章页面本身(通过您的管理仪表板),您可以预览查询结果,我想您就是已经这样做了。

通过数据浏览器运行该查询应返回相同的结果。

如果您仍然感到困惑,请给我们发一封电子邮件,我们将协助您深入排查。

我们经常收到关于“狂热爱好者(连续 100 天)”徽章的询问。通常的问题是,由于用户所在时区与服务器时区存在差异,用户可能错过了一天或更多天。

我一直对用于授予该徽章的查询有些困惑。不过,我现在认为已经理解了。以下是使用类似逻辑的 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

太好了,这正是我想要的见解 :slight_smile: