Вы ищете запросы, которые реализуют решения проблем с пробелами и островками.
Ваш вопрос довольно общий, поэтому позвольте мне привести пример такого запроса, например: найти игрока (ов) с самыми последовательными играми из 20 и более очков;также узнайте первую и последнюю игру серии, а также верхнюю / нижнюю точки.
Вот запрос для этой цели:
select top 1 with ties
PlayerID,
min(GameID) first_game,
max(GameID) last_game,
min(Points) min_points,
max(Points) max_points,
count(*) consecutive_games
from (
select
s.*,
row_number() over(partition by PlayerID order by GameID) rn,
sum(case when Points >= 20 then 1 else 0 end) over(partition by PlayerID order by GameID) sm
from PlayerStats s
) x
where Points >= 20
group by PlayerID, rn - sm
order by consecutive_games desc;
Это работает, выполняя условную сумму, упорядоченнуюпо игре, которая увеличивается для каждой игры выше 20 очков и сравнивается с последовательностью игр. Когда разница между суммой и последовательностью игр изменяется, начинается новая группа игр;остальное просто агрегация. Вы можете запустить подзапрос независимо, чтобы увидеть, что он возвращает;Вы также можете удалить предложение top 1
, чтобы увидеть весь список игр серии +20 очков.
С этими примерами данных:
PlayerID | GameID | Points
-------: | -----: | -----:
1 | 1 | 10
1 | 2 | 25
1 | 3 | 24
1 | 4 | 32
1 | 5 | 2
1 | 6 | 27
1 | 7 | 42
1 | 8 | 32
1 | 9 | 21
1 | 10 | 20
Запрос возвращает:
PlayerID | first_game | last_game | min_points | max_points | consecutive_games
-------: | ---------: | --------: | ---------: | ---------: | ----------------:
1 | 6 | 10 | 20 | 42 | 5
Вы должны быть в состоянии применить ту же логику для других характеристик.
Демонстрация на DB Fiddle