Нахождение последовательных строк выше определенного значения - PullRequest
0 голосов
/ 22 октября 2019

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

PK, PlayerID, OpponentID, GameID, Points, Rebounds, etc...

Я хотел бы знать, как возвращать такие запросы, как большинство последовательных игр с по меньшей мере 20 очками или последовательные игры с 10 подборами и т. Д. (У меня есть много других таблиц, где это также применимо, просто используя это в качестве примера.)

GameID в хронологическом порядке, так что это будет способ определения последовательных игр.

Я предполагаю, что это касается CTE, но я не очень хорошо разбираюсьв этой теме.

1 Ответ

0 голосов
/ 22 октября 2019

Вы ищете запросы, которые реализуют решения проблем с пробелами и островками.

Ваш вопрос довольно общий, поэтому позвольте мне привести пример такого запроса, например: найти игрока (ов) с самыми последовательными играми из 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

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