SQL查询按时间顺序分组

Seb*_*tes 3 sql database aggregate-functions window-functions gaps-and-islands

我正在研究一个业务案例,其中人们在不同时间访问不同地点。

我需要将每个系列分组在同一位置并将其作为一行返回。

为了说明这一点,我创建并填充了表访问(见下文)。

select loc, hour from visit order by hour给我

Loc Hour
1   10
1   11
1   12
2   13
2   14
1   15
1   16
Run Code Online (Sandbox Code Playgroud)

我想要一个返回以下内容的 SQL:

Loc first last
1 10 12
2 13 14
1 15 16
Run Code Online (Sandbox Code Playgroud)

有建议吗?


示例中的表格/数据

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);
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 6

这是一个典型的间隙和岛屿问题,您希望将同一位置的“相邻”访问分组在一起。

这是利用 s 之间的差异来解决该问题的一种方法row_number

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
Run Code Online (Sandbox Code Playgroud)

DB Fiddle 演示

洛克| 第一个小时 | 上一个小时
--: | ---------: | --------:
  1 | 10 | 10 12
  2 | 13 | 14
  1 | 15 | 15 16