Search for the largest group of consecutive numbers within a section

I have the following data sorted by player_id and match_date. I would like to know a group of records that has the maximum number of consecutive runs (4 runs from 2014-04-03 to 2014-04-12 for 3 consecutive times)

 player_id  match_date  runs
    1       2014-04-01    5
    1       2014-04-02    55       
    1       2014-04-03    4       
    1       2014-04-10    4       
    1       2014-04-12    4       
    1       2014-04-14    3       
    1       2014-04-19    4       
    1       2014-04-20    44               
    2       2014-04-01    23
    2       2014-04-02    23       
    2       2014-04-03    23       
    2       2014-04-10    23       
    2       2014-04-12    4       
    2       2014-04-14    3       
    2       2014-04-19    23       
    2       2014-04-20    1   

I came up with the following SQL:

select *,row_number() over (partition by ranked.player_id,ranked.runs
order by ranked.match_date) as R from (
select player_id ,match_date,runs from players order by 1,2 desc )
ranked order by ranked.player_id, match_date asc

But this one continues the rating from previous consecutive runs (4 runs on 2014-04-19 for player 1 are expected to get rank 1, but get rank 4, since there were 3 occurrences of the same section already). Similarly, 23 runs for player 2 on 2014-04-19 are expected to receive 1st level, but will receive 5th rank, as this player already had 4 cases out of 23 runs.

reset 1, ?

, , SQL SQLFiddle.

+4
2

.

select player_id, runs, count(*) as numruns
from (select p.*,
             (row_number() over (partition by player_id order by match_date) -
              row_number() over (partition by player_id, runs order by match_date)
             ) as grp
      from players p
     ) pg
group by grp, player_id, runs
order by numruns desc
limit 1;

, " " : ( ) , . , , .

- SQL.

+1
select p1.player_id, p1.match_date, p1.runs, count(p2.match_date) from players p1
join players p2 on p1.player_id = p2.player_id
    and p1.match_date >= p2.match_date
    and p1.runs = p2.runs
    and not exists (
        select 1 from players p3
        where p3.runs <> p2.runs
        and p3.player_id = p2.player_id
        and p3.match_date < p1.match_date
        and p3.match_date > p2.match_date
    )
group by p1.player_id, p1.match_date, p1.runs
order by p1.player_id, p1.match_date

http://sqlfiddle.com/#!15/78a77/1

+1

Source: https://habr.com/ru/post/1546457/


All Articles