Найдите три номера мест, которые последовательно доступны в ряд - PullRequest
0 голосов
/ 11 декабря 2018

Резервирование

    ROW_NUM      SEAT_NUMBER    STATUS
    R1           S1             Reserved
    R1           S2             Reserved
    R1           S3             Free
    R1           S4             Free
    R1           S5             Free
    R2           S1             Reserved
    R2           S2             Reserved
    R2           S3             Free
    R2           S4             Free
    R2           S5             Free
    R3           S1             Free
    R3           S2             Reserved
    R3           S3             Free
    R3           S4             Reserved
    R3           S5             Reserved

ТРЕБУЕМЫЙ ВЫХОД:

ROW_NUM      SEAT_NUMBER 
   R1           S3             
   R1           S4             
   R1           S5 
   R2           S3            
   R2           S4             
   R2           S5    

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать row_number().Ниже указаны группы смежных свободных мест:

select t.*, (seqnum - seqnum_s) as grp
from (select t.*,
             row_number() over (partition by row_num order by seat_number) as seqnum,
             row_number() over (partition by row_num, status order by seat_number) as seqnum_s
      from t
     ) t
where status = 'Free';

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

select t.*
from (select t.*,
             count(*) over (partition by row_num, seqnum - seqnum_s, status) as cnt
      from (select t.*,
                   row_number() over (partition by row_num order by seat_number) as seqnum,
                   row_number() over (partition by row_num, status order by seat_number) as seqnum_s
            from t
           ) t
      where status = 'Free'
     ) t
where cnt >= 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...