SQL查询按时间序列分组

时间:2020-02-21 14:23:35

标签: sql database group-by window-functions gaps-and-islands

我正在研究一个业务案例,人们在不同的时间访问位置。

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

为说明起见,我创建并填充了 visit 表(见下文)。

select loc, hour from visit order by hour给了我

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

我想要一个返回以下内容的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 个答案:

答案 0 :(得分:3)

这是一个典型的差距与孤岛问题,您想在同一位置将“相邻”访问分组到一起。

这是一种利用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

Demo on DB Fiddle

loc | first_hour | last_hour
--: | ---------: | --------:
  1 |         10 |        12
  2 |         13 |        14
  1 |         15 |        16
相关问题