SQL количество пользователей с выигрышными сериями - PullRequest
0 голосов
/ 15 февраля 2020

Я довольно новичок в SQL, и я возился с некоторыми небольшими проектами, чтобы понять, как его можно использовать для крупномасштабной статистики.

Проблема, над которой я сейчас работаю, состоит в том, чтобы просто подсчитать количество пользователей, которые выиграли серию за определенный период времени.

Учитывая таблицу в формате

user_id,date_time,user_team,win_team
ab542a,2018-01-02 18:45:25,team1,team1
ef72da,2018-01-02 08:20:01,team2,team1
f5c776,2017-12-30 15:25:25,team1,team2
5a278a,2018-01-01 14:27:15,team2,team2
ae346d,2018-01-01 14:27:15,team2,team2
2b13d8,2017-12-31 12:33:34,team1,team2
ace797,2018-01-02 08:20:01,team2,team2
ace797,2018-01-03 18:18:22,team1,team2
ab542a,2018-01-03 18:45:25,team1,team1
ef72da,2018-01-03 08:20:01,team2,team1
f5c776,2017-12-31 15:25:25,team1,team2
5a278a,2018-01-02 14:27:15,team2,team2
ae346d,2018-01-02 14:27:15,team2,team2
2b13d8,2018-01-01 12:33:34,team1,team2
ace797,2018-01-03 08:20:01,team1,team1
ace797,2018-01-04 18:18:22,team1,team1
ab542a,2018-01-04 18:45:25,team1,team1
ef72da,2018-01-04 08:20:01,team2,team1
f5c776,2018-01-01 15:25:25,team1,team2
5a278a,2018-01-03 14:27:15,team2,team2
ae346d,2018-01-03 14:27:15,team2,team2
2b13d8,2018-01-02 12:33:34,team1,team2
ace797,2018-01-04 08:20:01,team2,team2
ace797,2018-01-05 18:18:22,team1,team1

где user - идентификатор пользователя, date - дата матча, команда - сторона, за которую играл пользователь, а победитель - победившая сторона матча. Как я могу сосчитать всех пользователей, у которых была выигрышная серия (не менее 3 последовательных побед)?

Кроме того, скажем, я хочу также отслеживать ход игры (шахматы, нарды и др. c). .) в той же таблице, возможно ли в одном и том же запросе отслеживать полосы в нескольких играх?

В python это может быть достигнуто с относительно простым l oop по идентификаторам пользователей, но будет вычислительно дорогой и, вероятно, не будет хорошо масштабироваться

1 Ответ

1 голос
/ 15 февраля 2020

Если вы хотите, чтобы пользователи имели по крайней мере 3 победы подряд, вы можете использовать оконные функции, например, такие:

select count(distinct t.user)
from (select t.*,
             lead(date, 2) over (partition by user order by date) as date_2,
             lead(date, 2) over (partition by user, (case when team = winner then 'win' else 'lose' end
                                 order by date
                                ) date_same_2
      from t
      where date >= ? and date < ?
     ) t
where team = winner;

Для этого нужно проверить строку для пользователя на 2 строки вперед по двум критериям , Первый просто по дате. Второй - когда команда пользователя становится победителем. Если они одинаковы - а текущая строка является выигрышной - тогда у вас есть три победы подряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...