Рейтинг игроков по категориям за месяцы


Представьте себе следующую таблицу Player с полями:

PlayerId, Date, Kills and Gold
Мне нужно получить позицию игрока по категориям (убийства или золото) в течение нескольких месяцев. Это выбор:
SET @rownumber := 0;

SELECT date, rank, kills FROM (
    SELECT pla.event_date, @rownumber := @rownumber + 1 AS rank, 
    pla.kills, pla.player_id
    FROM player AS pla
    INNER JOIN ...
    WHERE.pla.event_date >= '2017-09-01' AND pla.event_date <= '2017-12-31'
    ORDER BY pla.kills DESC
) AS result WHERE player_id = 651894

Он отлично работает, когда я фильтрую его на один месяц. Проблема в том, что переменная @rownumber всегда увеличивается на +1 в следующем месяце, что не приносит нужного результата.

Я не имею в виду, что это функция для итерации по месяцам из бэкенда. Как я могу это сделать?

1 2

1 ответ:

Вам нужна другая пользовательская переменная, чтобы сообщить вам, когда это произойдет в новом месяце.

SET @rownumber := 0;
SET @month := 0;

SELECT pla.event_date, 
  @rownumber := IF(@month=MONTH(pla.event_date), @rownumber + 1, 1) AS rank, 
  @month := MONTH(pla.event_date) AS month,
  pla.kills, pla.player_id
FROM player AS pla
INNER JOIN ...
WHERE pla.event_date >= '2017-09-01' AND pla.event_date <= '2017-12-31'
ORDER BY MONTH(pla.event_date), pla.kills DESC