SQL Наибольшее количество последовательных значений для каждого значения - PullRequest
0 голосов
/ 08 июля 2020

У меня есть таблица MatchResults

id | player_win_id
------------------
1  |    1         
2  |    1        
3  |    3        
4  |    1        
5  |    2       
6  |    3
7  |    3
8  |    1
9  |    1
10 |    1

Мне нужно узнать для каждого идентификатора игрока наибольшее количество последовательных побед. Я использую MS SQL Server.

Ожидаемый результат

PLAYER_ID | WIN_COUNT
------------------
    1     |    3
    2     |    1 
    3     |    2

Ответы [ 2 ]

2 голосов
/ 08 июля 2020

Это тип проблемы с промежутками и островками. Одно решение использует разницу номеров строк. Итак, чтобы получить все полосы:

select player_win_id, count(*)
from (select t.*,
             row_number() over (order by id) as seqnum,
             row_number() over (partition by player_win_id order by id) as seqnum_p
      from MatchResults t
     ) t
group by player_win_id, (seqnum - seqnum_p);

Почему это работает, довольно сложно объяснить. Но если вы посмотрите на результаты подзапроса, вы, вероятно, увидите, как разница между значениями номеров строк захватывает соседние строки с одним и тем же идентификатором выигрыша игрока.

По максимуму, самый простой, вероятно, просто запрос агрегирования:

select player_win_id, max(cnt)
from (select player_win_id, count(*) as cnt
      from (select t.*,
                   row_number() over (order by id) as seqnum,
                   row_number() over (partition by player_win_id order by id) as seqnum_p
            from MatchResults t
           ) t
      group by player_win_id, (seqnum - seqnum_p)
     ) p
group by player_win_id;
0 голосов
/ 08 июля 2020

Теперь я понял предыдущий комментарий. Код для моей таблицы:

select player_win_id, max(cnt)
from (select player_win_id, count(*) as cnt
      from (select *,
                   row_number() over (order by id) as seqnum,
                   row_number() over (partition by player_win_id order by id) as seqnum_p
            from MatchResults ) t
      group by player_win_id, (seqnum - seqnum_p)
     ) p
group by player_win_id;
...