SQL запрос к группе по хронологическим рядам - PullRequest
3 голосов
/ 21 февраля 2020

Я работаю над бизнес-кейсом, где люди посещают места в разное время.

Мне нужно сгруппировать каждую серию в одном месте и вернуть ее как один ряд.

Для иллюстрации я создал и заполнил таблицу визит (см. Ниже).

select loc, hour from visit order by hour дает мне

Loc Hour
1   10
1   11
1   12
2   13
2   14
1   15
1   16

I хотел бы SQL, который возвращает следующее:

Loc first last
1 10 12
2 13 14
1 15 16

Предложения, кто-нибудь?


Таблица / данные в примере

create table visit ( loc number(2), hour number(2) );

insert into visit (loc, hour) values (1,10);
insert into visit (loc, hour) values (1,11);
insert into visit (loc, hour) values (1,12);
insert into visit (loc, hour) values (2,13);
insert into visit (loc, hour) values (2,14);
insert into visit (loc, hour) values (1,15);
insert into visit (loc, hour) values (1,16);

1 Ответ

3 голосов
/ 21 февраля 2020

Это типичная проблема пробелов и островов, когда вы хотите сгруппировать «смежные» посещения в одном месте.

Вот один из способов ее решения с использованием разницы между row_number s :

select 
    loc,
    min(hour) first_hour,
    max(hour) last_hour
from (
    select
        t.*,
        row_number() over(order by hour) rn1,
        row_number() over(partition by loc order by hour) rn2
    from visit t
) t
group by loc, rn1 - rn2
order by first_hour

Демонстрация на DB Fiddle :

loc | first_hour | last_hour
--: | ---------: | --------:
  1 |         10 |        12
  2 |         13 |        14
  1 |         15 |        16
...