Проверка соответствия требованиям для получения значка

Один из наших пользователей сообщил, что, по его мнению, ему должна быть присвоена определённая значок. Я заглянул на страницу администрирования значков и выполнил запрос «Предварительный просмотр выданных значков», но его нет в списке.

Является ли лучшим способом проверки потенциального соответствия использование такого инструмента, как Data Explorer, для получения дополнительной информации из базы данных?

На самой странице значка (через вашу панель администратора) вы можете просмотреть результаты запроса, и, как я понимаю, вы это уже сделали.

Выполнение этого запроса через Data Explorer должно вернуть те же результаты.

Если вы всё ещё не можете разобраться, напишите нам на почту, и мы поможем вам разобраться.

Мы часто получаем вопросы о значке Aficionado (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: